2013-06-19 36 views
2

在有關散列和醃製密碼的教程中,我看到了使用for循環多次執行散列+鹽。多次執行散列醃製

$salt = dechex(mt_rand(0, 2147483647)) . dechex(mt_rand(0, 2147483647)); 

    $password = hash('sha256', $_POST['password'] . $salt); 

    for($round = 0; $round < 65536; $round++) 
    { 
     $password = hash('sha256', $password . $salt); 
    } 

使用這種方法的優點是什麼?比如暴力方法更安全嗎? 另外:我應該考慮除sha256以外的另一個哈希算法嗎?我知道沒有明確的答案,因爲它可能取決於很多因素,如安全程度,速度等。但是有沒有什麼建議讓我們說一個相當簡單的網站?

回答

1

多次迭代哈希的原因是爲了減慢計算速度。今天(2013年)你可以用普通硬件計算每秒約1.4 Giga SHA256 hashes,所以你可以在一毫秒的時間內用一個大約500'000字的蠻力強制整個英文字典。

這就是爲什麼人們應該使用像BCrypt或PBKDF2這樣的慢密鑰派生函數來散列密碼。使用一些毫秒進行登錄是沒有問題的,但每秒只有1000字的暴力攻擊是不切實際的。

PHP 5.5將自己的函數password_hash()和password_verify()準備好,以簡化生成BCrypt哈希。我強烈建議使用這個優秀的api,或者早期的PHP版本是compatibility pack。用法很簡單:

// Hash a new password for storing in the database. 
// The function automatically generates a cryptographically safe salt. 
$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT); 

// Check if the hash of the entered login password, matches the stored hash. 
// The salt and the cost factor will be extracted from $existingHashFromDb. 
$isPasswordCorrect = password_verify($password, $existingHashFromDb); 

如果你有興趣在一個更詳細的解答,你可以看看我的tutorial有關安全存儲密碼。

+0

非常感謝你爲這個徹底的答案。您的教程對於像我這樣的初學者來說是一個很好的建議,可以用於散列和醃製密碼。 – Kiwi1

1

http://www.openwall.com/phpass/

是更很好用soltuions之一,我會看看如何實現。

存在這種循環的原因是爲了減緩散列過程。由於有更多的計算,反映查找表需要更長的時間。

通過使用該循環,您已經放慢了某人掃描密碼達65536次。