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 : 또한 비밀번호를 확인할 때 해시에서 소금을 읽는 것이 좋습니다. 소금을 별도의 필드에 저장하고 거기에서 읽는 대신. (소금은 해시에 포함 된 것으로 보이기 때문에 불필요 해 보인다.)
CRYPT_SALT_LENGTH는 Win7 컴퓨터에서 60을 반환하고, 우분투에서는 123을 반환합니다. –
@Burak Guzel : 매뉴얼에 따르면 ** PHP는 사용 가능한 해시 **가 허용하는 가장 긴 유효한 소금을 나타내는'CRYPT_SALT_LENGTH'라는 이름의 상수를 설정합니다. –
@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