Bcrypt

為什麼 0x00 會使 bcrypt 變弱?

  • March 5, 2016

在以下網站上:

https://paragonie.com/blog/2015/04/secure-authentication-php-with-long-term-persistence

在談到使用 bcrypt 的危險時,它指出:

雜湊中的原始字節之一是 0x00 的可能性非常大。這個字節越早出現在字元串中,發現衝突的成本就會成倍降低。

我不完全理解這意味著什麼以及 0x00 如何比任何其他十六進制數字更快地導致發現衝突。有人可以向我更清楚地解釋這一點。我也不明白為什麼通過 base64_encode 發送它會有所不同,因為密碼仍然相同並且可以使用 base64_decode 解碼。

此外,在此頁面上,它指出使用 base64_encode 將繞過 bcrypt 的 72 個字元限制。但是,如果 bcrypt 算法將任何輸入限制為 72 個字元,為什麼不將 base64_encoded 字元串限制為 72 個字元?

在許多情況下,0x00被視為字元串的結尾。這就是問題發揮作用的地方。因此,如果我傳入password\x00defgreallylongpasswordbcrypt,密碼將在之後password由於空字節而終止。這是一個非常不安全的密碼,很容易通過字典攻擊找到。

然而,沒有人在密碼欄位中輸入空字節。部落格文章說這在實踐中可能發生的地方是,如果您首先對密碼進行雜湊處理,然後通過 bcrypt 執行它。雜湊摘要中有可能包含一個空字節,這將導致 bcrypt 程式碼截斷它。

發帖人通過建議您在將密碼的雜湊值提供給 bcrypt 之前對密碼的**雜湊值進行 base64 編碼來解決這個問題。**base64 編碼不會有空字節。

這種雜湊然後 bcrypt 構造已被提議作為繞過 bcrypt 的 72 個字元限制的一種方法。也就是說,我同意我們姐妹網站上的這個答案。如果您將 bcrypt 用於您期望可能大於 72 個字元的值,那麼您可能沒有將 bcrypt 用於其預期目的,並且應該重新考慮您在做什麼。

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