“$E$ 是本单元规范编码,公开随机数 $n C,n S$ 用来区分握手。双方分别签 与 ,先核对期望身份、公钥、参数及签名。再构造 $T 1=E(T 0,\sigma C,\sigma S)…”
形式陈述
HKDF把密钥派生拆成两步。输入材料 IKM 可以是协议产生的共享秘密;salt 是提取阶段的盐,通常可公开;info 是扩展阶段的用途和协议上下文。采用HMAC理路HMAC的内外层密钥哈希HMAC · Hash-based message authentication code从密钥归一化和内外pad写出HMAC字节接口,复算标准向量,并区分MAC安全、PRF假设与裸前缀哈希。及输出长度 HashLen:
未提供salt时,RFC5869规定使用 HashLen 个零字节。提取输出PRK应在适用的源分布和HMAC提取假设下可作为伪随机密钥,而不是只因为“已经哈希”便获得保证。扩展接受这样的PRK,令
输出 OKM 是
直觉
Extract解决“手上有一种共享秘密,但其字节分布未必适合直接作为PRF密钥”;Expand解决“从一个好密钥,按不同用途得到足够长度的密钥材料”。二者的输入资源不同。
有种子提取器理路有种子随机性提取器Seeded randomness extractor · Seeded extractor用独立均匀短种子把任意高最小熵弱源映为统计上接近均匀的输出。给出统计距离、源熵和独立种子的形式定义;HKDF并不自动继承那个对所有弱源成立的信息论定理。其现实哈希实例和证明使用特定计算假设。最小熵理路最小熵Min-entropy · Rényi min-entropy由最可能结果的概率定义、直接刻画单次最优猜测成功率的信息量。帮助说明已有不确定性,不能被输出长度取代。只可能有1000种的密码即使均匀也至多有
例子与边界
RFC5869附录A.1固定SHA-256、22字节 0b 的IKM,salt为 000102030405060708090a0b0c,info为 f0f1f2f3f4f5f6f7f8f9,
077709362c2e32df0ddc3f0dc47bba6390b6c73bb50f9c3122ec844ad7c2b3e5。
扩展需要两块。info || 01 计算HMAC;T1 || info || 02 计算HMAC。拼接后取32+10字节,得到
3cb25f25faacd57a90434f64d0362f2a2d2d0a90cf1a5a4c5db02d56ecc4c5bf34007208d5b887185865。
这可用检查器逐字节核对。若仅改变
salt不需要保密,但其选择与IKM之间的独立性、攻击者能否操纵它以及认证时机属于分析条件。info按RFC5869 §3.2应独立于IKM的值,用来绑定协议、身份和用途;不要把IKM自己塞入info冒充额外熵。由DH值派生时不能仅因它长度够就跳过Extract。
推论与应用
当PRK满足所需的PRF密钥理路伪随机函数Pseudorandom function · PRF由短密钥索引且对高效查询者不可与真随机函数区分的函数族。条件,Expand的不同输入可在相应计算模型下近似独立地供给不同用途。完整结论还要计入提取误差、PRF优势和调用数;本页的标准向量只是算法正确性证据。
HKDF适合协议密钥调度,设计目标没有故意增加每次猜测的时间与内存开销。口令存储应由专用慢哈希承担,不能把公开salt加HKDF当作等价替代。一个派生密钥的公开也不自动意味着PRK泄漏,但若PRK泄漏,所有可重建info对应的后续密钥都能重算。
Expand准确调用