2014-03-26 61 views
4

我很確定crypt()PHP函數真的很困惑。

當第二個密碼明顯使用不同的第二個參數時,以下兩個密碼函數如何給出相同的輸出? Diff salt意味着diff散列正確嗎?

echo crypt("password", '$2y$09$anexamplestringforsalt$')."\n<br>"; 
echo crypt("password", crypt("password", '$2y$09$anexamplestringforsalt$'))."\n<br>"; 

輸出:

$2y$09$anexamplestringforsale/.K.VdgECUVEd9N4ja3u1WtgPi5BXZq 

回答

11

的原因是因爲該鹽是隱窩提供散列的輸出的一部分。

$2y$09$anexamplestringforsale/.K.VdgECUVEd9N4ja3u1WtgPi5BXZq 

也就是說被分成幾個部分組成:

  • 2y - 算法標識符(bcrypt)
  • 09 - 成本參數
  • anexamplestringforsale - 鹽
  • /.K.VdgECUVEd9N4ja3u1WtgPi5BXZq - 散列

這樣做的結果是可以直接使用結果散列作爲驗證調用中的鹽的好處。

$hash = crypt($password, $salt); 

if ($hash === crypt($password, $hash)) { 

現在你不需要單獨存儲算法,成本或鹽。只需將它們直接存儲在散列結果中即可。簡單。

此外,我強烈建議您使用簡化的密碼哈希API,其目的是專門用於緩解這些問題:password_hash()

+0

感謝您的信息,最大。投票。 –

+0

欣賞它!這有助於。所以基本上,crypt函數分解了$ hash字符串,並將子字符串(salt部分)用於實際的鹽? – user3388884

+0

正確。它實際上使用了除散列部分之外的所有部分。如果使用我鏈接的簡化密碼哈希API,'password_verify()'也會使用哈希部分來驗證哈希值。簡而言之,如果您直接生成鹽或直接使用隱藏,則可能會出現錯誤。 [如何在PHP中使用bcrypt密碼](http://stackoverflow.com/questions/4795385/how-do-you-use-bcrypt-for-hashing-passwords-in-php/17073604#17073604) – ircmaxell