PHP有你需要的散列函數。我更喜歡使用hash_pbkdf2(),但它只適用於後一版本的PHP。所以我經常使用標準化程度較低的crypt()函數。
它們的工作方式基本相同:您需要輸入密碼,算法和一些鹽,然後多次輸入密碼(數千)。輸出哈希包括走進它(算法,鹽和發),所以你可以當有人試圖登錄重新創建哈希額外的參數
兩種技術的優點是:
- 你有你的散列算法
- 加入隨機鹽的選擇使得字典攻擊更難
- 散列的額外回合,使蠻力攻擊更難。
我寫了一個簡短的例子,用一個小單元測試。
/* Hashes a password using 2000 rounds of SHA-256 and a random salt.
Returns a string.
*/
function hashpw($password) {
$algo = '$5$rounds=2000$'; // specify SHA-256
$salt = $algo . mt_rand();
return crypt(strval($password), $salt);
}
/* Given a password and a hash produced by hashpw(), tells you if the hash
belongs to the password or not.
Returns a boolean.
*/
function confirmpw($password, $hash) {
return (crypt(strval($password), strval($hash)) === $hash);
}
$passwords = array(
'hello world',
'secret',
'super-secret',
'my pets name',
);
foreach($passwords as $onePass) {
$hash = hashpw($onePass);
$verified = confirmpw($onePass, $hash) ? 'verified' : 'failed' ;
echo "$onePass ==> $hash ==> $verified \n";
}
這不是很容易轉換成一個正常的PHP應用程序,也可以判斷它的缺乏使用它我會說它沒有嘗試和測試 – Sammaye