2014-10-10 9 views
3

코드 :PHP password_hash 함수 소금 길이 21 또는 22?

echo password_hash("stackoverflow", PASSWORD_DEFAULT, ['salt' => 'twenty-one-characters']); 

결과 :

Warning: password_hash(): Provided salt is too short: 21 expecting 22 

코드 :

echo password_hash("stackoverflow", PASSWORD_DEFAULT, ['salt' => 'twenty-one-charactersA']); 

결과 :

$2y$10$dHdlbnR5LW9uZS1jaGFyYOVyX13hK9eb4/KXMAkHsAJX..YR7t/32 
,

코드 :

echo password_hash("stackoverflow", PASSWORD_DEFAULT, ['salt' => 'twenty-one-charactersB']); 

$2y$10$dHdlbnR5LW9uZS1jaGFyYOVyX13hK9eb4/KXMAkHsAJX..YR7t/32 

질문 : 우리가 22 자 두 개의 서로 다른 염을 만들었지 만, 해시가 동일

보시다시피, 21 개 문자열에 A와 B를 추가하여! 그것은 22 번째 문자가 무시됩니까? 그것이 무시된다면 왜 22 문자의 소금을 요구합니까?

+0

왜 자신을 염색하고 기본값을 사용하지 않습니까? –

+1

[복어] (http://php.net/manual/en/function.crypt.PHP는) 기본 알고리즘, 22 문자 소금에 대한 자세한 내용 –

답변

1

BCrypt는 주어진 알파벳의 염을 기대 : ./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz. 보시다시피 '-'는 그 안에 없기 때문에 소금이 유효하지 않은 이유입니다. 유효한 소금은 해시 값에서 평문을 볼 수 있습니다.

대부분의 경우 salt 매개 변수를 생략하는 것이 가장 좋습니다. 이 매개 변수가 없으면 함수는 운영 체제의 무작위 소스에서 암호 학적으로 안전한 소금을 생성합니다.

password_hash("stackoverflow", PASSWORD_DEFAULT); 

그렇지만 BCrypt가 전체 22 문자를 사용하지 않는다고 말하는 것은 맞습니다. BCrypt는 22 개의 base64 인코딩 된 문자로 얻는 128 비트 대신에 126 비트의 소금 만 사용합니다. 자세한 내용은이 토론 Why does crypt/blowfish generate the same hash...을 참조하십시오.

+0

Bcrypt는 전체 22 문자를 사용합니다. 하지만 그것은 22 번째 비트의 처음 2 비트만을 사용합니다 ... – ircmaxell

+0

@ 예를 들어 그것은 실제로 무엇을 의미합니까, 내 대답에 문제가 있습니까? 모든 경우에 나는 당신의 훌륭한 링크를 기억할 것입니다. – martinstoeckli

0

먼저 하시기 바랍니다 자신의 소금을 제공하지 마십시오. 도서관이하는 것보다 더 나은 직업을 창출하지 못할 것입니다. 그리고 정적 소금을 사용하면 (예에서와 같이) 보안을 침해합니다. 그냥 소금을 만들어 보자. (덧붙여 말하자면, 소금을 넣는 것이 내가 API에서 가장 큰 실수라고 생각한다).

21 대 22 자까지는 this answer을 읽으십시오.

기본적으로 소금은 base64로 인코딩됩니다. 즉, 소금의 6 비트마다 8 비트로 인코딩됩니다. 따라서 인코딩 된 소금의 모든 바이트는 6 비트입니다.

21 문자는 126 비트입니다. 즉, 22 번째 문자의 일부만 사용됩니다 (처음 2 개의 디코딩 된 비트). 동일한 해시를 AB과 함께 사용하는 이유는 두 문자에 대해 선행 2 비트가 동일하기 때문입니다.

실제로 22 번째 바이트에는 4 개의 유일한 해시가 있습니다.