Hash

為什麼我們將十六進制輸出用於雜湊函式?

  • July 17, 2021

為什麼我們預設使用十六進製表示作為雜湊函式結果的輸出?

例如,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 編碼再次意味著一些非平凡的拆分。

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