2010-07-19 2 views
0

나는 CodeIgniter를 사용하여 웹 사이트를위한 로그인 라이브러리를 개발 해왔다. 인증 코드는 다음과 같습니다.PHP와 MySQL에서 소금 내기

function signin($username, $password) 
{ 
    $CI =& get_instance(); 
    $query_auth=$this->db->query('SELECT user_id, banned FROM user WHERE username=? AND password=SHA1(CONCAT(?,salt)) LIMIT 1', array($username, $password)); 

    if($query_auth->num_rows()!=1) 
     return 2; 
    else 
    { 
     if($query_init->row()->banned==1) 
      return 3; 
     else 
     { 
      $CI->load->library('session'); 
      $this->session->set_userdata('gauid', $query_auth->row()->user_id); 
      return 1; 
     } 
    } 
} 

반환 값은 성공, 실패 또는 금지를 나타냅니다. 각 사용자는 데이터베이스에 저장된 고유 한 소금을 가지고 있습니다.

원래 데이터베이스에서 소금을 가져 와서 사용자가 입력 한 암호와 소금을 PHP의 데이터베이스에서 결합한 다음 조합 된 값으로 데이터베이스에 다시 쿼리했습니다. 데이터베이스에 단 하나의 여행이 필요하고 코드가 적어지기 때문에 속도가 빨라질 것이라고 생각했습니다. 나는 또한 모든

첫째, 당신의 DBMS (MySQL은) 가 암호화를 위해 어떤 지원을 할 필요가 없습니다 ...하지만이 질문 Salting my hashes with PHP and MySQL 가기 reponse를 읽은 후, 동등하게 안전 할 것이라고 생각 해시. PHP 쪽에서 모든 을 수행 할 수 있으며, 수행해야 할 작업은 입니다.

... 나는 보안상의 문제가 있었는지 궁금해하기 시작했다.

실제로이 코드가 잘못 되었습니까?

+0

[PHP 암호 용 보안 해시 및 소금] 가능한 복제본 (http://stackoverflow.com/questions/401656/secure-hash-and-salt-for-php-passwords) – rook

+0

어떻게 표시되는지 모르겠다. 참된! 질문은 완전히 다릅니다. – j82374823749

+0

다음은 너무 지역화되어있어 닫아야합니다. – rook

답변

2

그 자체가 잘못되었습니다. 암호화되지 않은/해시되지 않은 비밀번호를 가지고있는 모든 트래픽은 용의주합니다. 따라서 예를 들어, 서버가 원격 서버이고 해당 서버와의 통신에서 암호화 작업을하지 않을 경우 암호를 가로 채려는 또 다른 순간입니다. 또한 쿼리가 어딘가에 (기본적으로 또는 느린 속도로) 기록된다면 평범한 암호를 저장하지 말고 모든 서버 로그에 앉아서 사용하고있는 일반 암호 + 소금을가집니다. 어딘가에. 자신의 코드에서 개인적으로 수행 한 경우에는 발생하지 않습니다.

모든 것은 편집증 환자의 방식에 달려 있습니다. 악용하기가 훨씬 쉬우 며 세션 고정과 같은 악을 종종 잊어 버릴 수 있습니다.

+0

죄송합니다, 그 자체로 애완 동물은 피하십시오. :) –

+0

이 보안 문제를 이미 생각하고있는 한 평범한 텍스트로 모든 비밀번호 시도를 기록하지 않는 것이 중요하지 않습니다. 그렇지 않으면 위와 같이 동의합니다. –

+0

해싱! = 암호화 – rook