“HKDF把密钥派生拆成两步。输入材料 可以是协议产生的共享秘密; 是提取阶段的盐,通常可公开; 是扩展阶段的用途和协议上下文。采用HMAC及输出长度 :”
形式陈述
HMAC是使用密码哈希构造消息认证码的具体算法。设底层哈希输出
36 十六进制字节,5c 字节。SHA-256实例中
这条公式定义算法,不独立证明安全。作为MAC,需要相应的不可伪造结论;用于HKDF或密钥扩展时,通常还需要PRF性质。两项主张与底层压缩函数的假设、查询范围和具体分析有关。仅有“哈希抗碰撞”不能机械推出这里需要的全部PRF保证。
直觉
内层把密钥混入消息处理,外层再用不同pad把内部摘要封住。攻击者拿到的是外层输出,不能像某些Merkle–Damgård裸前缀哈希那样,把暴露的链值继续扩展成合法新消息标签。
内外pad是构造规定的一部分,不是两把可随意选用的独立密钥;把它们设相同、删除一层或调整填充,都变成另一个需要重做分析的算法。现实应用应调用可信库,手写公式主要用于理解和标准向量核对。
例子与边界
RFC4231测试1使用20字节 0b 作为密钥、ASCII字符串 Hi There 作为消息。HMAC-SHA256完整32字节结果为
b0344c61d8db38535ca8afceaf0bf12b881dc200c9833da726e9376c2e32cff7。
可以逐层复算:先把20字节密钥补44个零;分别与64字节ipad、opad异或;内层哈希输入长为64+8=72字节;外层输入长为64+32=96字节。这里是传入哈希的长度,不含SHA-256内部自行添加的填充。
若密钥是100字节,先哈希得到32字节,再补32个零;不能直接截成64字节。HMAC的密钥归一化也意味着不同原始密钥可能得到同一
HMAC不隐藏消息,也不自动拒绝旧消息。收到一份旧的合法标签再验一次仍会通过,协议需要自己的接收状态。使用短标签时,理想
推论与应用
HMAC把既有MAC抽象落到一个可互操作的字节算法,但旧MAC页中的EUF-CMA、强新鲜性和PRF归约仍是安全接口的主定义。HMAC的内外层结构不能被当成任意组合协议的认证证明。
检查器通过Python标准库计算RFC4231已公布向量,再用同一HMAC实现HKDF。两个输出一致支持实现符合这些测试输入;它不测试底层机器的侧信道,也不证明所有消息长度或所有平台的实现都正确。
若底层哈希每块成本固定,消息m字节、原密钥k字节,计算成本为
参考资料
- Hugo Krawczyk、Mihir Bellare、Ran Canetti,RFC 2104,§2:密钥归一化、pad和HMAC构造;§5:截断
- M. Nystrom,RFC 4231,§4.2测试1:HMAC-SHA256向量
- Dan Boneh、Victor Shoup,A Graduate Course in Applied Cryptography, v0.6,§8.7,特别是§§8.7.1–8.7.2:two-key nest分析与HMAC标准之间的假设桥梁