查看雜湊輸出——Base64 編碼是否比 HEX 編碼更好?
我想知道為什麼大多數*“正常/不安全”*的加密散列(如 SHA-256、SHA-512、Whirlpool、RipeMD-160、MD5 等)都是 HEX 編碼的。
但是大多數*“安全”*加密雜湊(KDF’)都喜歡
bcrypt
並且scrypt
是 Base64 編碼的。為什麼?在某處我聽說 Base64 將字元串縮短了 20%。對於在迭代期間散列的密碼並使其抗碰撞能力降低,這不是非常糟糕嗎?
如果 Base64 真的因為某種原因更安全,那為什麼 Argon2 輸出 HEX 編碼呢?
如果您閱讀它們的規範,算法本身只會輸出二進制(即字節)。它是輸出十六進制和/或 base64 的 API 和應用程序中的實現。
有時也有特定的標準/慣例來指定某種輸出格式。例如,bcrypt 密碼散列算法的輸出就是這種情況。在這種情況下,不僅會顯示雜湊值,還會顯示算法類型、迭代次數以及是否加鹽。
Base64 比 hex 更高效,而 hex 更容易被人類消化。字節的值以及字節的數量在十六進制中更容易看到;例如,儲存的字節量只是顯示的十六進制數字的一半。然而,對於文本格式或更大的雜湊值,可以選擇 base64 以提高效率(base64 的成本約為 33%,而 hex 的成本為 100%)。
命令行實用程序
md5sum
及其sha1sum
繼任者始終保持輸出十六進制;因此,希望保持兼容的應用程序更有可能輸出十六進制。請注意,我已將此答案中術語“Base64”和“HEX”的大小寫更改為小寫,以與RFC 4648:嘗試標準化編碼的 Base16、Base32 和 Base64 數據編碼兼容。它僅在標題中使用大寫變體。“Hex”是縮寫,不是首字母縮寫詞,所以全部大寫沒有意義。
就我個人而言,我更喜歡十六進制全部大寫;人們更容易辨識字母/數字的上部,因此將其用作預設值是有意義的(在我所有的舊電腦上,字元也是大寫的,所以它們在大多數調試器中)。