4. 截断 (Truncation)
4.1 实现说明 (Implementation Note)
HMAC 的定义方式使得底层散列函数 H 可以在不修改其代码的情况下使用。特别是, 它使用具有预定义初始值 IV (每个迭代散列函数指定的固定值, 用于初始化其压缩函数) 的函数 H。但是, 如果需要, 可以以 (可能) 修改 H 的代码以支持可变 IV 为代价来实现性能改进。
其思想是, 在密钥 K 生成时或在其首次使用之前, 可以仅预计算一次压缩函数在 B 字节块 (K XOR ipad) 和 (K XOR opad) 上的中间结果。这些中间结果被存储, 然后在每次需要认证消息时用于初始化 H 的 IV。对于每条认证消息, 此方法节省了 H 的压缩函数在两个 B 字节块 (即 (K XOR ipad) 和 (K XOR opad)) 上的应用。在认证短数据流时, 此类节省可能是显著的。我们强调, 存储的中间值需要与密钥一样被处理和保护。
选择以上述方式实现 HMAC 是本地实现的决定, 对互操作性没有影响。
4.2 截断输出 (Truncated Output)
消息认证码的一个众所周知的实践是截断 MAC 的输出并仅输出部分位 (例如 [MM, ANSI])。Preneel 和 van Oorschot [PV] 展示了截断基于散列的 MAC 函数输出的一些分析优势。该领域的结果对于截断的整体安全优势并不是绝对的。它有优点 (攻击者可获得的散列结果信息更少) 和缺点 (攻击者需要预测的位更少)。HMAC 的应用可以选择通过为某个参数 t 输出 HMAC 计算的最左边 t 位来截断 HMAC 的输出 (即, 计算以第 2 节中定义的正常方式进行, 但最终结果被截断为 t 位)。我们建议输出长度 t 不少于散列输出长度的一半 (以匹配生日攻击界限) 且不少于 80 位 (攻击者需要预测的位数的合适下界)。我们建议将使用散列函数 H 且输出 t 位的 HMAC 实现表示为 HMAC-H-t。例如, HMAC-SHA1-80 表示使用 SHA-1 函数计算且输出截断为 80 位的 HMAC。(如果未指定参数 t, 例如 HMAC-MD5, 则假设输出散列的所有位。)