2014-03-26 2 views
4

나는 crypt() PHP 함수에 대해 혼란 스럽다.

두 번째 암호문이 다른 두 번째 인수를 분명히 사용하고있을 때 다음 두 가지 암호 기능이 동일한 출력을 어떻게 내 보냅니 까? diff salt는 diff 해시를 의미합니까?

echo crypt("password", '$2y$09$anexamplestringforsalt$')."\n<br>"; 
echo crypt("password", crypt("password", '$2y$09$anexamplestringforsalt$'))."\n<br>"; 

출력 :

$2y$09$anexamplestringforsale/.K.VdgECUVEd9N4ja3u1WtgPi5BXZq 

답변

11

염 그 토굴 제공 해시의 출력의 일부하기 때문이다. 여러 구성 요소로 분리된다

$2y$09$anexamplestringforsale/.K.VdgECUVEd9N4ja3u1WtgPi5BXZq 

:

  • 2y - 알고리즘 식별자 (bcrypt)
  • 09 - 비용 파라미터
  • anexamplestringforsale - 염
  • /.K.VdgECUVEd9N4ja3u1WtgPi5BXZq - 해시

결과적으로 확인 호출에서 결과 해시를 직접 소금으로 사용할 수 있다는 멋진 속성이 있습니다.

$hash = crypt($password, $salt); 

if ($hash === crypt($password, $hash)) { 

이제 알고리즘, 비용 또는 소금을 별도로 저장할 필요가 없습니다. 해시 결과에 직접 저장하면됩니다. 단순한.

또한이 문제를 특별히 완화하기 위해 설계된 간소화 된 암호 해시 API를 사용하는 것이 좋습니다 (password_hash()).

+0

정보를 제공해 주셔서 감사합니다. 투표하기. –

+0

감사합니다! 도움이됩니다. 그래서 기본적으로 암호 함수는 $ 해시 문자열을 분해하고 실제 소금에 부분 문자열 (소금 부분)을 사용합니까? – user3388884

+0

수정하십시오. 실제로 해시 부분을 제외한 모든 부분을 사용합니다. 그리고 내가 연결된 간단한 암호 해싱 API를 사용한다면,'password_verify()'는 해쉬 부분을 사용하여 해시를 확인합니다. 간추려서, 직접 소금을 생성하거나 crypt를 직접 사용하는 경우 문제가 발생할 가능성이 큽니다. [PHP에서 bcrypt를 암호로 사용하는 방법] (http://stackoverflow.com/questions/4795385/how-do-you-use-bcrypt-for-hashing-passwords-in-php/17073604#17073604) – ircmaxell

관련 문제