2012-11-27 89 views
4

可能重複:
Is 「double hashing」 a password less secure than just hashing it once?哈希散列使它更安全嗎?

我加密在PHP中使用SHA1密碼,但我想知道如果哈希散列是任何不僅僅是散列密碼更安全。

例如:

$hash = sha1($pwd); 

$hash = sha1(sha1($pwd)); 

任何安全性較低的,我不明白爲什麼它不會是,因爲反向查找網站將無法能夠找到哈希散列的匹配。

+1

看一看 http://stackoverflow.com/questions/348109/is-double-hashing-a-password-less-secure-than-just-hashing-it-once – Michael

+3

快速的SHA是有用的各種各樣的地方,密碼存儲不是其中之一。密碼散列應該用昂貴的計算算法完成,比如PBKDF2。 – lynks

+0

標誌着它不會只是被關閉,而是被運輸到加密。我會就此對META進行討論。 –

回答

-2

首先,和sha1一樣弱,它比明文存儲的密碼要好。任何加密,散列或其他混淆都比明文更好!

sha1的問題在於它的速度很快,所以它很快就會產生哈希來破解它。 Salting有很多幫助,但是如果你的服務器被攻破並且你的salt hash被存儲爲某個字符串的字符串,那麼就有這個優點...

如果你不想使用mcrypt或者其他加密方法,你可以的mixup您的SHA1哈希有點像這樣:

$my_super_sha1_hash = 
sha1(
    sha1(
     substr(
      sha1($username) 
      , 0 
      , strlen($password) 
     ) 
    ) 
    .sha1(
     substr(
      sha1($password) 
      , 0 
      , 40-strlen($password) 
     ) 
    ) 
); 

通過用戶名和密碼混合在一起,並使用(未知),密碼的長度,以確定在隨後被再次散列刺痛使用什麼比特每,每種鹽都是獨一無二的,但不是隨機的,所以結果在所有用戶中都是一致的,而且LOT更難以破解,因爲必須考慮密碼和用戶名的字符串長度。

+0

這比用戶名和密碼連接散列*少*安全。 –

+0

你錯過了鹽的點。這不是什麼祕密,它對於每個哈希來阻止多目標攻擊都是不同的。如果攻擊者知道鹽,這仍然是有益的。 (儘管除了獨特的每個用戶值之外還使用未知值是另一個優點)。您還忘記提及關鍵強化,即使用哈希函數,這對計算攻擊者來說非常昂貴。 – CodesInChaos

+0

你的混音方案也很愚蠢。對於短密碼,鹽空間變得非常小,對於長密碼密碼的貢獻消失,並且對於長密碼,代碼甚至不能正確工作。你的方案明顯不如簡單的'sha1(sha1(username).sha1(password))',甚至只是'sha1(username。「|」.password)' – CodesInChaos

2

雙散列並沒有真正的幫助。 Salting呢。

2

爲了使您的密碼存儲的安全,你不應該使用sha1或任何其他快速哈希算法,而不是使用密鑰導出函數BCrypt

快速算法的問題是,您可以使用常見硬件(in 2012)計算每秒3千兆sha1散列值。這使得有可能在不到一毫秒的時間內用一個大約500000個單詞強制整個英語詞典!

你的例子中的第二個問題是缺少鹽。如果您沒有爲每個密碼使用獨特的鹽,攻擊者可以構建一個單獨的彩虹表來獲取所有密碼。

BCrypt是專門設計用於哈希密碼,因此(需要一些計算時間)。利用成本因素,您可以將所需的時間適應未來(因此速度更快)的硬件。在內部,它的操作與你的建議類似,它以很安全的方式重複哈希很多次。

使用BCrypt可以是一樣容易,作爲使用SHA1哈希。 PHP 5。5將自己的功能password_hash()password_verify()準備就緒,以簡化此任務。還有一個用於PHP 5.3/5.4的compatibility pack,可在password_compat下載。