我最近閱讀了一篇關於password hashing and salting的文章,其中解釋了它的含義(在「SlowEquals代碼如何工作?」下),必須使用SlowEquals函數來比較輸入密碼的哈希與數據庫中密碼的哈希值。爲什麼SlowEquals函數比較散列密碼很重要?
據我所知,它使用SlowEquals函數,因爲它使用XOR而不是==,因此將檢查兩個字符串中的每個字符,而不是在第一個不匹配的字符上失敗。
有兩件事情我不明白:
- 爲什麼異或繼續檢查字符串達到以失敗狀態之後。
- 如果主要思想是在嘗試破解密碼時不給攻擊者提供任何有用的信息,那麼隨機生成的時間就不會有睡眠()函數這麼做了嗎?
銥星很好的解釋了這個問題。 SlowEquals可以用來阻止*基於時間的旁道攻擊*。增加額外延遲的問題是統計信息能夠消除任何恆定時間延遲。此外,它可以用來消除任何隨時間推移而不變的延遲*(!)因此,在0到10之間添加完全隨機的延遲將平均延遲5秒。假設一個成功的比較需要.1s和一個不太成功的0.05s,那麼你可以簡單地做1000次相同的比較,如果平均需要大約5.1s,你猜對了。統計是一個婊子:) –
1)SlowEquals是一個壞名字。只要時間不變,它是否緩慢並不重要。典型的實現非常快。 2)這裏不重要*。持續時間比較對於MAC驗證至關重要。 – CodesInChaos
關於security.se的相關問題[bcrypt是否比較「length-constant」時間內的哈希值?](http://security.stackexchange.com/questions/46212/does-bcrypt-compare-the-hashes-in-length -constant-time) – CodesInChaos