Encryption

SHA-512 版本的 Unix crypt 命令中的鹽長度

  • November 16, 2020

SHA-512 crypt 規範報告 SHA-512 crypt 使用 128 位鹽。

FreeBSD/Linux 密碼生成程式碼使用 16 字節隨機數據(128 位)建構 salt ,然後使用類似B64 編碼(這是 base64 變體)之類的東西來轉換隨機數據。

一位顧問報告說:

由於子集的基數,每個字元代表 6 位資訊。通過這種方法生成大小為 16 個字元的鹽會產生 16x6 = 96 位的偽隨機數據。

總之,看起來這個實現的鹽只使用了 96 位。

我不同意這一點,因為這裡的 B64 只是用於具有可列印字元。隨機值用於拾取有效字元。Base64 編碼的字元串長度增加,這裡我們有相同的長度。然後隨機字元串被 SHA-512 實現原樣使用(它傳遞一個 128 位的值)。

有人可以確認顧問的聲明並解釋更多嗎?

C 程式碼的分析是題外話。它輸出一個SALTSIZE=32 個字元的字元串,每個字元是通過將 ASCII 編碼的 64 個基本字元的字元串索引為單個字節而獲得的。指標是按照低位求得的 $ 4\times6 $ 似乎是由arc4random().

因此輸出是一個 32 字節的字節串(不包括字元串終止符/字節),每個字節都從一組 64 個中抽取,因此 $ 32\times8=256, $ 位,與 $ 32,\log_2(64)=192, $ 熵位(最多,假設全熵源)。

我得出結論,“16x6 = 96 位偽隨機數據”和“128 位值”都不適用於連結程式碼產生的內容。但是等等,連結的規範告訴

對於基於 SHA 的方法,SALT 字元串可以是最多使用 16 個字元的簡單字元串。

這表明某些東西(至少,使用鹽進行加密的程式碼)應該將 32 個字元的鹽截斷為 16。在這種情況下,仍然有一個 16 字節的字節串,每個字節都從一組 64 中抽取,因此 $ 16\times8=128, $ 位,與 $ 16,\log_2(64)=96, $ 熵位(最多,假設全熵源)。

這與顧問所說的相符,儘管可以用“提供 16x6 = 96 位的偽隨機數據”更清楚地重述結尾

語句“Base64 編碼的字元串長度增加”適用於 Base64 編碼,而不適用於程式碼的作用。


每條評論添加:

這應該是正式的 128 位鹽還是 96 位鹽?

我的(有爭議的)立場:截斷到 16 個字元後,鹽是 128 位 $ 2^{96} $ 可能的值,因此從防止預計算的角度來看,(充其量)被認為與具有全熵的 96 位均勻隨機鹽一樣有效。這已經足夠了。

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