我目前正在實現一個登錄系統。我想將密碼和salt存儲在數據庫中。現在我發現有一個hash()
和一個crypt()
函數似乎也這樣做(對SHA512有效)。hash()與crypt()函數的比較
hash()
更新,似乎支持更多的哈希alogrithms比crypt()
。或者我應該知道/關心其他任何差異?
編輯:
function generatePasswordHash($password){
$salt = base64_encode(mcrypt_create_iv(8));
$calculatedPasswordHash = crypt($password, '$1$' . $salt . '$');
return $calculatedPasswordHash;
}
結果看起來像$1$Qh6ByGJ9$zLn3yq62egvmc9D7SzA2u.
這裏我的密碼檢測功能:
function checkLoginData($username, $password){
global $db;
$sql = "SELECT * FROM users WHERE username = :username";
$result = $db->ExecuteQuery($sql, array("username"=>$username));
if(!empty($result)){
$result = $result[0];
$savedPasswordHash = $result['password'];
$splitted = explode("$", $savedPasswordHash);
$salt = $splitted[2];
$calculatedPasswordHash = crypt($password, '$1$' . $salt . '$');
if($savedPasswordHash === $calculatedPasswordHash){
return true;
}
}
return false;
}
@CodeInChaos:從數據庫中存儲和訪問密碼散列。兩者都可以採用salt(通過串聯將salt添加到'hash()'的'$ data'參數)。 – testing 2012-04-23 13:30:39
在許多情況下,只將鹽與數據串聯起來是不安全的。不要這樣做,除非你真的知道你在做什麼。它也是*快*,你希望它變得*慢*。 – CodesInChaos 2012-04-23 13:33:46
新代碼加密密碼,而不是散列它。即其平凡可逆。 – CodesInChaos 2012-04-23 17:52:03