為什麼我們將十六進制輸出用於雜湊函式?
為什麼我們預設使用十六進製表示作為雜湊函式結果的輸出?
例如,SHA-256 雜湊函式:以十六進製表示的 SHA-256 的輸出使用64 個字元,而在原始輸出上使用 Base64 會產生44 個字元。
展示:
<?php $password = "password"; $sha256 = hash('sha256',$password); echo 'sha256('.strlen($sha256).'): '.$sha256.'<br />'; $sha256Base64 = base64_encode(hash('sha256',$password,true)); echo 'sha256('.strlen($sha256Base64).'): '.$sha256Base64.'<br />';
輸出:
sha256(64): 5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8 sha256(44): XohImNooBHFR0OVvjcYpJ3NgPQ1qq73WKhHvch0VQtg=
十六進制是傳統的——我的意思是,首先有命令行工具使用十六進制進行輸出,然後其他使用散列函式的人發現它適合堅持十六進制,只要能夠將它們的值與上述工具的輸出。這就是傳統的建立方式:開始時或多或少的隨機選擇,然後需要互操作性和向後兼容性。
在密碼算法中使用十六進制的情況下,可能可以追溯到使用 C 語言進行參考實現。大多數算法都使用規範(數學描述,通常在 LaTeX 中排版)和生成基本測試向量的參考實現來描述。無論好壞,參考實現通常是 C(或有時是 C++)。在 C 中,沒有用於 Base64 編碼的標準工具(一些程式平台或外部庫提供,但它不是標準的);但是十六進制很容易通過簡單
printf()
的“%08x
”格式字元串獲得。作為一個非常經典的範例,請考慮MD5 規範 (RFC 1321),其中包含一個執行十六進制輸出的參考實現。傳統根深蒂固;對於SHA-3 競賽,NIST 實際上要求提供 C 語言的參考實現,以及使用完全指定的十六進製文本格式的已知答案測試。
還必須說十六進制便於調試:人類開發人員可以通過在腦海中進行簡單的轉換,輕鬆觀察十六進制輸出並將其映射到各個位。Base64 並不那麼簡單,因為它需要 64 個字形而不是 16 個,包括一些容易引起視覺混淆的字形(1 vs I vs l,0 vs O …)。此外,許多算法在內部使用 32 位或 64 位字,可以很好地映射到 CPU 寄存器;32 和 64 是 4 的倍數,但不是 6 的倍數,因此 Base64 編碼再次意味著一些非平凡的拆分。