2011-01-13 2 views
10

crypt() documentation에 따르면, 소금은 "./0-9A-Za-z"알파벳의 22 자리 64 자리 여야합니다.는 그 소금이 예상되는 뜻 :Crypt() 함수의 복어 염 길이?

crypt('rasmuslerdorf', '$2a$07$usesomesillystringforsalt$'); 

첫 혼란 부분은 그 소금은 25 자,하지 (22)

질문 # 1을 가지고 있습니다 :

그들이주는 코드 예제입니다 길이가 더 길다. 22 문자보다?

그런 다음 함수를 직접 테스트하고 뭔가를 알아 봤습니다. 나는 20 문자 salt를 사용할 때 내가 20 문자 salt를 사용하는 경우, 나는 그래서이

// using 20 char salt: 00000000001111111111 
crypt('rasmuslerdorf', '$2a$07$00000000001111111111$'); 
// $2a$07$00000000001111111111$.6Th1f3O1SYpWaEUfdz7ieidkQOkGKh2 

를 얻을 전체 소금 출력입니다. 소금을 별도의 장소에 보관할 필요가 없어 편리합니다. (난 무작위로 소금을 사용하고 싶다). 생성 된 해시에서 소금을 다시 읽을 수 있습니다.

그러나 설명서에 기록 된대로 22 자리의 소금을 사용하거나 더 긴 소금을 사용하면 끝 부분에서 소금이 잘립니다.

// using 22 char salt: 0000000000111111111122 
crypt('rasmuslerdorf', '$2a$07$0000000000111111111122$'); 
// $2a$07$000000000011111111112uRTfyYkWmPPMWDRM/cUAlulrBkhVGlui 
// 22nd character of the salt is gone 

// using 25 char salt: 0000000000111111111122222 
crypt('rasmuslerdorf', '$2a$07$0000000000111111111122222$'); 
// $2a$07$000000000011111111112uRTfyYkWmPPMWDRM/cUAlulrBkhVGlui 
// Same hash was generated as before, 21 chars of the salt are in the hash 

질문 # 2 : 그래서, 소금의 적절한 길이는 정확히 무엇인가? 20? 22? 더 길게?

질문 # 3 : 또한 비밀번호를 확인할 때 해시에서 소금을 읽는 것이 좋습니다. 소금을 별도의 필드에 저장하고 거기에서 읽는 대신. (소금은 해시에 포함 된 것으로 보이기 때문에 불필요 해 보인다.)

답변

8

블로우 피쉬 염은 길이가 22 문자 (후행 $ 포함 21 개) 여야합니다. var_dump(CRYPT_SALT_LENGTH)을 다시 확인할 수는 있지만 지금은 확인할 수 없지만 적은 문자는 오류를 반환하고 문자는 더 많이 표시됩니다. 잘 렸어.

세 번째 질문에 대해 : 예, 해시 자체에서 포함 된 소금 (및 비용) 매개 변수를 사용하여 해시를 읽고 확인해야합니다.

+1

CRYPT_SALT_LENGTH는 Win7 컴퓨터에서 60을 반환하고, 우분투에서는 123을 반환합니다. –

+1

@Burak Guzel : 매뉴얼에 따르면 ** PHP는 사용 가능한 해시 **가 허용하는 가장 긴 유효한 소금을 나타내는'CRYPT_SALT_LENGTH'라는 이름의 상수를 설정합니다. –

+2

@Burak Guzel : CRYPT_SALT_LENGTH는 PHP 5.3.1까지는 60을, 5.3.2에서 123을 반환합니다. SHA-256 (64 char salt)과 SHA-512 (123 char long salt)가 PHP 5.3.2에서 소개 되었기 때문입니다. – Sliq

관련 문제