Key-Derivation

為什麼我們不一起使用 bcrypt 和 scrypt 呢?

  • August 15, 2015

每個人都在將 bcrypt 與 scrypt 進行比較。Bcrypt 被證明,大量的密碼分析,到目前為止沒有漏洞,但使用的記憶體非常低。雖然 scrypt 使用了大量的記憶體,但它的生命還為時過早。級聯/一起使用它們有什麼問題嗎?就像 scrypt 密碼然後 bcrypt 結果。例如:bcrypt(scrypt(pwd))

這是一種有問題的方法,還是每個人都試圖用一個且只有一個 KDF 來解決一個問題?

可能是因為簡單的級聯只會對某些攻擊更強,同時為更多的實現錯誤打開了大門。

雖然 bcrypt 和 scrypt 是密碼散列函式,但這個問題的答案中關於組合散列函式的大部分內容都適用於此。不同的結構會產生抗原像性和 PRF-ness,而所需的結構在某種程度上取決於使用情況。(密碼儲存主要與前者有關,而如果您使用 scrypt 派生加密密鑰,後者也很重要。)

關於實現錯誤,如果應用於原始密碼的內部函式通過某種側通道攻擊洩露輸入,則外部函式可能根本無關緊要。相反,如果外部函式以某種方式洩露了它的輸出,那麼使用級聯加密密鑰可能會被完全破壞,並且將其用於密碼儲存可能會允許離線攻擊。

使用密碼散列還有一個額外的問題是如何劃分時間。如果您在 bcrypt 和 scrypt 上花費相同的時間,則使用 ASIC 或 GPU 的專用攻擊可能幾乎是您在 scrypt 上花費所有時間的兩倍。

除此之外,scrypt 基本上已經是一種級聯算法。在內部,它使用 PBKDF2 預處理輸入並生成最終輸出數據。因此,它的原像抗性至少應等於單輪 PBKDF2 的抗原像性,即具有 SHA-256 的 HMAC。

引用自:https://crypto.stackexchange.com/questions/19479