2012-12-10 36 views
2

據我所知,PHP的crypt()函數的工作原理是這樣:使用PHP的crypt()函數創建bcrypt散列時,是否需要鹽?

crypt($password,$salt); 

而且,爲了創造一個bcrypt哈希(這被認爲是非常安全的)格式爲:

crypt("$2y$15$password",$salt); 

其中$ 2Y指定使用bcrypt,15是回合的數量,它應該在10以上。

這是我的問題。運行:

crypt("$2y$15$password"); 

在我的理解,產生一個漂亮的大隨機鹽,並將其添加到哈希,以及比較密碼時,這是自動提取。這意味着我不必在我的桌子上放一個鹽場,或者獨立產生鹽。這是安全和正確的嗎?

例如,當我運行:

$test = "Hello"; 
echo crypt("$2y$15$test") . "\n"; 

我得到:

$6$R59d/nemygl0$/Gk6s57K2eFAkH4BWDGYhfdhbYGcqz.GRbD7qGDKOlhE5Lk.kgCoGQo/sDCCf1VDffdh7jtXPn/9rsexwrpFk1 

前6個是指某種算法號,兩個$之間的下一個位是鹽,和那之後的那一點就是哈希。它是否正確?

此外,將這個散列與另一個散列進行驗證的語法是什麼? 謝謝。

回答

2

我認爲你使用它的地窖使用SHA-512。

您可能忘了在crypt()中傳遞$ test作爲參數。

根據php docs您應該傳遞密碼作爲第一個參數(不帶任何前綴),然後將salt作爲第二個參數傳遞$ 2y $ 15前綴和一個22個字符的鹽。例如。

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

功能crypt()應該使用這樣的:

$hashvalue = crypt($password, $cryptParams); 

,而鹽必須由自己產生的,是$ cryptParams一部分。

$bcryptAlgo = '$2y'; 
$cost = '$15'; 
$salt = '$' . functionThatGenerates22CharRandomSalt(); 
$cryptParams = $bcryptAlgo . $cost . $salt; 

其中一個難點是產生有效的,獨特的和不可預知的鹽。你可以做的最好的是從操作系統隨機數據源中讀取數據。

PHP 5.5將自己的功能password_hash()password_verify()準備就緒,以簡化這項任務。我強烈建議使用這個優秀的API,還有一個compatibility pack可用於早期的PHP版本。如果您想了解更多關於如何使用crypt的信息,請查看article

您的成本參數爲15非常高,如果您可以承受這麼多時間,請使用它,但是今天可以使用10。

相關問題