許多連續的雜湊來減緩蠻力攻擊?
我聽說像這樣的雜湊算法
bcrypt
更安全,因為它們需要更長的時間才能完成,因此需要更長的時間來暴力破解,而合法使用者不會有明顯的延遲。多次使用更快的算法(例如 SHA-256)是否安全?例如:hash = "password" for x in range(5000): hash = hashlib.sha256(hash).hexdigest
因為它必須對數據進行散列,然後對散列進行散列等等,這比單個 SHA-256 散列花費的時間要長得多,這難道不會完成同樣的事情嗎?
如果您只是被迭代雜湊方案的想法所吸引,那麼我將使用PBKDF2而不是那種本土方案。它使用了這樣一種方案,儘管與您描述的不完全一樣,並且經過充分研究並被認為是安全的。
然而,與 bcrypt 相比,PBKDF2 沒有太多優勢,因為 PBKDF2 仍然容易受到 GPU 和 FPGA/ASIC 暴力攻擊。bcrypt 抵制 GPU 暴力破解,因為算法中使用了 4K 表,這會強制爭用 GPU 中的全域記憶體匯流排。但是 bcrypt 仍然可能容易受到 FPGA/ASIC 攻擊,儘管大多數人不必擔心這一點。
較新的 KDF scrypt 也可以根據其使用的記憶體量進行調整,因此它比 bcrypt 更能抵抗 FPGA/ASIC 攻擊(如果調整得當)。但是,與 bcrypt (1999) 相比,scrypt 相對較新 (2009),所以這可能會讓您有些緊張。
本質上,要儲存密碼,您可能應該使用 bcrypt,因為它似乎達到了抗 GPU 以及足夠成熟的最佳位置。但是 PBKDF2 和 scrypt 還是不錯的;使用這三個中的任何一個都很好。
有關更多資訊,我建議查看以下問題,Thomas Pornin 給出了(優秀的)最佳答案:是否有安全專家推薦 bcrypt 用於密碼儲存?他比我更有資格,所以如果你不相信我,希望他的證詞能令人信服。
你上面描述的方案有一些缺陷。因為您沒有在每次迭代中播種散列輸入,所以您確實增加了發生衝突的機會。這是一個很好的例子,說明了為什麼你應該盡量避免自己實現這些東西。很容易忽略一些會破壞系統安全性的細微之處。
如前所述,使用經過良好測試的解決方案為您執行此操作(bcrypt、PBKDF2 等)比嘗試自己建構更安全(也更容易!)。