2011-01-13 114 views
10

根據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:另外,在檢查密碼的時候,從散列中讀出鹽是否是一個好主意?而不是把鹽存放在一個單獨的領域,並從那裏讀取。 (這似乎是多餘的,因爲鹽似乎包含在散列中)。

回答

8

河豚鹽應該是22個字符長(包括尾隨$,所以21) - 你可以仔細檢查var_dump(CRYPT_SALT_LENGTH),我現在無法驗證,但我的猜測是,更少的字符將返回錯誤和更多的字符被截斷。

關於你的第三個問題:是的,你應該使用哈希本身嵌入的鹽(和成本)參數來讀取和檢查哈希。

+1

CRYPT_SALT_LENGTH在我的Win7機器上返回60,在Ubuntu上爲123。 – 2011-01-13 18:52:13