2012-04-23 2 views
11

현재 로그인 시스템을 구현 중입니다. 암호와 소금을 데이터베이스에 저장하려고합니다. 이제는 hash()crypt() 기능이 동일한 것으로 보이는 것으로 나타났습니다 (SHA512에서 유효).hash() 대 crypt() 함수 비교

hash()은 신품이며 crypt()보다 많은 해싱 알고리즘을 지원하는 것으로 보입니다. 아니면 내가 알아야 할 다른 차이점이 있습니까?

는 편집 :

function generatePasswordHash($password){ 
    $salt = base64_encode(mcrypt_create_iv(8)); 
    $calculatedPasswordHash = crypt($password, '$1$' . $salt . '$'); 

    return $calculatedPasswordHash; 
} 

결과는 보이는 여기 $1$Qh6ByGJ9$zLn3yq62egvmc9D7SzA2u.

내 암호 검사 기능과 같은 :

function checkLoginData($username, $password){ 
    global $db; 

    $sql = "SELECT * FROM users WHERE username = :username"; 
    $result = $db->ExecuteQuery($sql, array("username"=>$username)); 

    if(!empty($result)){ 
     $result = $result[0]; 
     $savedPasswordHash = $result['password']; 
     $splitted = explode("$", $savedPasswordHash); 
     $salt = $splitted[2]; 
     $calculatedPasswordHash = crypt($password, '$1$' . $salt . '$'); 

     if($savedPasswordHash === $calculatedPasswordHash){ 
      return true; 
     } 
    } 

    return false; 
} 
+0

@CodeInChaos : 데이터베이스에서 암호 해시를 저장하고 액세스합니다. 둘 다 소금을 사용할 수 있습니다 (연결을 통해'hash() '의'$ data' 매개 변수에 소금 추가). – testing

+1

많은 경우 소금을 데이터에 연결하는 것이 안전하지 않습니다. 당신이하는 일을 정말로 알지 못한다면, 그렇게하지 마십시오. 그것은 또한 * 빠르며 * 당신은 * 천천히 그것을 원합니다. – CodesInChaos

+1

새 코드는 암호 해시 대신 암호를 암호화합니다. 즉 그 가역적으로 가역적이다. – CodesInChaos

답변

15

사용 hash 해시, 무결성 검사 예를 들면. 지정된 해시 알고리즘을 직접 사용합니다.

crypt은 특수 목적 기능입니다. 암호 해싱과 키 파생에 사용됩니다. 당신은 간접적으로 사용 된 해싱 스키마를 결정하는 소금을 전달해야합니다. CRYPT_SHA512을 선택한다고해도 이것은 보통 SHA512가 아닙니다. 이것은 SHA512를 빌딩 블록으로 사용하는 주요 파생 함수입니다. 특히 그러한 계획은 의도적으로 느리고 (거친 폭력 공격) 소금과 암호를 안전한 방법으로 결합합니다.

로그 시스템에서 비밀번호 해시의 경우, crypt이 분명히 올바른 선택입니다.

+0

암호 해시를 저장/검색하는 데 어떤 기능을 사용 하시겠습니까? – testing

+2

'crypt'와'CRYPT_BLOWFISH' 그리고 고품질 소금은'mcrypt_create_iv'와 같은 암호화 된 PRNG에서 괜찮을 것입니다. 이것은 PHP 5.3이 필요합니다. 하지만 필자는 PHP 프로그래머가 아니기 때문에 자세한 내용을 살펴 보지 않았습니다. – CodesInChaos

+0

웹 공간은'Standard DES'와'MD5' 만 제공한다는 것을 알게되었습니다. 나는'mcrypt' 라이브러리를 살펴볼 것입니다 ... – testing