Hmac
我是否正確理解 HMAC-SHA-xxx 和 HMAC-SHA-xxx-yyy?
我最近開始研究 HMAC,有幾件事我不能 100% 確定我理解正確。我對這三件事是正確的嗎?
- HMAC-SHA-xxx 的輸出長度為 xxx 位
- HMAC-SHA-xxx-yyy 的輸出長度為 yyy 位
- 如果我有一個生成 HMAC-SHA-xxx 輸出的函式,那麼我可以通過返回 HMAC-SHA-xxx 輸出的第一個 yyy 位來創建一個生成 HMAC-SHA-xxx-yyy 輸出的函式。
如果我誤解了他們中的任何一個,那又如何呢?
- HMAC-SHA-xxx 的輸出長度為 xxx 位
沒錯,預設情況下HMAC函式的輸出和hash的輸出是一樣的。如果您考慮 HMAC 的設計,這一點是顯而易見的。
- HMAC-SHA-xxx-yyy 的輸出長度為 yyy 位
當然。它已在古老的RFC 2104 - HMAC: Keyed-Hashing for Message Authentication中以這種方式定義,第 5 節:截斷輸出。
沒有多少實現允許您指定輸出大小,因此您可能必須自己截斷。請注意,如果您必須執行截斷,最好在驗證 HMAC 值時執行時間常數比較。
如果雜湊的截斷不可用(例如,SHA-224 已經是 SHA-256 的截斷版本),則可以選擇使用標準化的截斷版本的 SHA-2。它的缺點是雜湊的內部安全性與輸出大小一起降低。
- 如果我有一個生成 HMAC-SHA-xxx 輸出的函式,那麼我可以通過返回 HMAC-SHA-xxx 輸出的第一個 yyy 字節來創建一個生成 HMAC-SHA-xxx-yyy 輸出的函式。
是的,你會使用最左邊的位/字節。yyy 將以位為單位,因此您必須除以 8(我只允許 yyy 的倍數為 8)。
請注意,RFC 的作者在第 5 節中談到了“推薦”和“提議”,因此 HMAC-<hash>-yyy 的實現似乎是嚴格可選的。