散列散列不會增加額外的安全性。 (事實上,如果這個人有一個散列哈希查找表,它可能會變得更糟)。
最好的哈希將是計算上最昂貴的執行沒有任何漏洞。我會散列密碼至少sha-256。
總是使用醃製密鑰來散列您的密碼。此密鑰應該是唯一的每個密碼。它不需要私人儲存。醃製密碼的用途是,獲得對數據庫訪問權限的黑客不能簡單地將散列與已知的與通用密碼對應的散列列表進行比較。相反,他必須嘗試通過嘗試每個可能的密碼來強制密碼。
通過對每個密碼使用唯一的salt,即使它們使用相同的密碼,也可以保證數據庫中的每個散列值都不相同。
爲了使用密碼,只需創建一個隨機字符串並將其附加到密碼。下面是一個帶有48位salt和sha-256的示例哈希:
function make_password($password)
{
# random 48-bit salt (8 chars when base64 encoded)
$salt = base64_encode(pack('S3', mt_rand(0,0xffff), mt_rand(0,0xffff), mt_rand(0, 0xffff)));
return $salt.hash('sha256', $salt.$password);
}
function check_password($password, $hash)
{
$salt = substr($hash, 0, 8);
return hash('sha256', $salt.$password) == substr($hash, 8);
}
$password = 'password';
$hash = make_password('password');
echo $hash."\n";
var_dump(check_password('password', $hash));
var_dump(check_password('wrong', $hash));
每次運行它時,哈希將會不同。要驗證密碼,請選擇用戶名匹配的行,然後致電check_password($password_from_user, $hash_from_db)
。
下面是一個示例輸出:
AzrD1jZzc693714a43ad5dfd4106c0a620ef23ff9915070711fa170a6670b8164862b496
bool(true)
bool(false)
,如果你願意的話,可以使用更大的鹽或更強的哈希算法。但至少,我會使用類似上述的東西。
我不確定你在測試什麼? – Neal 2011-05-24 18:09:12
更適合什麼目的?如果你正在尋找安全性,我不會使用MD5。使用兩者都不會增加安全性。在某些情況下,它實際上可以減少它。 – 2011-05-24 18:10:39
也許話題是不正確的,但想找到解決方案如何讓用戶通過破解不可能或使它只是很難破解它。 – ZeroSuf3r 2011-05-24 18:12:19