2014-08-27 15 views
1

로그인 할 때 PBKDF2를 사용할 때 암호를 확인하는 방법을 알아 내려고합니다. PHP를 사용하고 있으므로 기본 비밀번호 생성 코드는 다음과 같습니다.PBKDF2 암호 저장 - 유효성을 검사하는 방법?

$salt = mcrypt_create_iv(16, MCRYPT_DEV_URANDOM); 
echo hash_pbkdf2('sha256', 'password', $salt, 1000, 32); 

데이터베이스에 해시 된 비밀번호를 저장했습니다. 소금이 없어 소금이 각 사용자마다 무작위로 생성되므로 로그인 입력에 대해이 암호를 테스트하는 방법을 모르겠습니다. 저장된 암호에서 소금을 "추출"하고 입력 된 암호 앞에 추가하고 저장된 암호와 비교하여 결과를 테스트하려면 어떻게합니까?

+1

['password_hash'] (http://php.net/manual/en/function.password-hash.php)를 사용할 수 없습니까? PHP 5.5가 아니라면 5.3.7 이상 버전에서 사용할 수있는 [동등한 구현] (https://github.com/ircmaxell/password_compat)이 있습니다. – Jon

+0

고맙습니다.이게 존재했는지 나는 알지 못했습니다 ... – Gasim

답변

3

당신은 예를 들어, 해시와 함께 소금을 저장해야합니다

$hash = $salt . '|' . hash_pbkdf2(.., .., $salt, ..); 

그런 다음 나중에 다시에서 소금을 추출하고 검증 알고리즘에 다시 급지 할 수 있습니다. 사실 해시에 대한 모든 관련 입력 매개 변수 (암호 자체는 제외하고)를 사용하여 필요에 따라 나중에 알고리즘을 변경하면서 해시 된 암호의 유효성을 계속 검증 할 수 있도록 허용해야합니다.

$hash = $algo . '|' . $salt . '|' . $rounds . '|' . hash_pbkdf2($algo, .., $salt, $rounds, ..); 

실제로는 이미 crypt API를 사용해야하며 이미 이와 비슷합니다.

하지만 실제로는 password_hash을 사용해야합니다. crypt 주위에 사용자 친화적 인 래퍼가 있어야 올바르게 작동합니다.

+0

이 사실을 완전히 이해하고 있지만이 시스템에 들어 가지 않은 것이 하나 있습니다 ... 우리가 그것을 노출시키고 있다면 소금을 사용하는 것이 무엇입니까? 그것을 해시로 가장하는 것일까 요? – Gasim

+3

소금의 포인트는 비밀이 아니며 해시를 유일하게 만드는 것입니다. – deceze

+0

안녕하세요, @deceze, 나는 웹 응용 프로그램에 암호 해싱이 유형을 구현할 수 있을지 궁금하네요. 그러나 건물을보고 있지만 아직 입력을받지 못했습니다. 위의 의견은 내 질문에 대한 거의 완벽한 해결책 인 것 같습니다. 왜 예상대로 출력되지 않을지 확신 할 수 없습니다. – mhvvzmak1