根據crypt() documentation,salt必須是來自字母表「.0-9A-Za-z」的22個鹼基的64位數字。Crypt()函數的河豚鹽長度?
這是他們給出的代碼例如:
crypt('rasmuslerdorf', '$2a$07$usesomesillystringforsalt$');
第一混亂的部分是,鹽具有25個字符,而不是22
問題1:是否意味着該鹽應該要比更長比22個字符?
然後我自己測試了這個函數,發現了一些東西。如果我使用20個字符的鹽,我得到這個
// using 20 char salt: 00000000001111111111
crypt('rasmuslerdorf', '$2a$07$00000000001111111111$');
// $2a$07$00000000001111111111$.6Th1f3O1SYpWaEUfdz7ieidkQOkGKh2
因此,當我使用20個字符的鹽時,整個鹽在輸出中。這很方便,因爲我不必將鹽儲存在一個單獨的地方。 (我想用隨機鹽)。我將能夠從生成的散列中讀出鹽。
但是,如果我使用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,在Ubuntu上爲123。 – 2011-01-13 18:52:13