為什麼 0x00 會使 bcrypt 變弱?
在以下網站上:
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\x00defgreallylongpassword
bcrypt,密碼將在之後password
由於空字節而終止。這是一個非常不安全的密碼,很容易通過字典攻擊找到。然而,沒有人在密碼欄位中輸入空字節。部落格文章說這在實踐中可能發生的地方是,如果您首先對密碼進行雜湊處理,然後通過 bcrypt 執行它。雜湊摘要中有可能包含一個空字節,這將導致 bcrypt 程式碼截斷它。
發帖人通過建議您在將密碼的雜湊值提供給 bcrypt 之前對密碼的**雜湊值進行 base64 編碼來解決這個問題。**base64 編碼不會有空字節。
這種雜湊然後 bcrypt 構造已被提議作為繞過 bcrypt 的 72 個字元限制的一種方法。也就是說,我同意我們姐妹網站上的這個答案。如果您將 bcrypt 用於您期望可能大於 72 個字元的值,那麼您可能沒有將 bcrypt 用於其預期目的,並且應該重新考慮您在做什麼。