3. Notes to HKDF Users (HKDF 用户注意事项)
3. Notes to HKDF Users (HKDF 用户注意事项)
本节包含一组关于使用 HKDF 的指导原则。有关这些原则和设计原理的更详细说明可以在 [HKDF-paper] 中找到。
3.1. To Salt or not to Salt (是否使用盐值)
HKDF 被定义为可以使用或不使用随机盐值。这样做是为了适应盐值不可用的应用。然而, 我们强调, 使用盐值会显著增加 HKDF 的强度, 确保哈希函数不同使用之间的独立性, 支持"源独立"提取, 并加强支持 HKDF 设计的分析结果。
随机盐值在两个方面与初始密钥材料根本不同: 它是非秘密的, 可以重复使用。因此, 盐值对许多应用都是可用的。例如, 通过将 HKDF 应用于可再生的熵池 (例如, 采样的系统事件) 来持续产生输出的伪随机数生成器 (pseudorandom number generator, PRNG) 可以固定一个盐值, 并将其用于 HKDF 的多次应用, 而无需保护盐值的秘密性。在不同的应用领域, 从 Diffie-Hellman 交换派生加密密钥的密钥协商协议可以从通信方之间交换和认证的公共随机数派生盐值, 作为密钥协商的一部分 (这是 [IKEv2] 中采用的方法)。
理想情况下, 盐值是长度为 HashLen 的随机 (或伪随机) 字符串。然而, 即使质量较低的盐值 (尺寸较短或熵有限) 仍然可能对输出密钥材料的安全性做出重大贡献; 因此, 如果应用可以获得这些值, 鼓励应用设计者向 HKDF 提供盐值。
值得注意的是, 虽然不是典型情况, 但某些应用甚至可能有可供使用的秘密盐值; 在这种情况下, HKDF 提供了更强的安全保证。这种应用的一个例子是 IKEv1 的"公钥加密模式", 其中提取器的"盐值"是从秘密的随机数计算出来的; 类似地, IKEv1 的预共享模式使用从预共享密钥派生的秘密盐值。
3.2. The 'info' Input to HKDF (HKDF 的 'info' 输入)
虽然 'info' 值在 HKDF 的定义中是可选的, 但它在应用中通常非常重要。它的主要目标是将派生的密钥材料绑定到应用特定和上下文特定的信息。例如, 'info' 可能包含协议号、算法标识符、用户身份等。特别是, 它可以防止为不同上下文派生相同的密钥材料 (当在这些不同上下文中使用相同的输入密钥材料 (IKM) 时)。如果需要, 它还可以适应密钥扩展部分的额外输入 (例如, 应用可能希望将密钥材料绑定到其长度 L, 从而使 L 成为 'info' 字段的一部分)。'info' 有一个技术要求: 它应该独立于输入密钥材料值 IKM。
3.3. To Skip or not to Skip (是否跳过)
在某些应用中, 输入密钥材料 IKM 可能已经作为加密强度高的密钥存在 (例如, TLS RSA 密码套件中的预主密钥将是一个伪随机字符串, 除了前两个八位字节)。在这种情况下, 可以跳过提取部分, 直接在扩展步骤中使用 IKM 作为 HMAC 的密钥。另一方面, 为了与一般情况兼容, 应用仍然可以使用提取部分。特别是, 如果 IKM 是随机 (或伪随机) 的但比 HMAC 密钥长, 提取步骤可以用于输出合适的 HMAC 密钥 (在 HMAC 的情况下, 通过提取器进行这种缩短并非严格必要, 因为 HMAC 被定义为也可以使用长密钥)。但是, 请注意, 如果 IKM 是 Diffie-Hellman 值, 如在使用 Diffie-Hellman 的 TLS 中, 则不应该跳过提取部分。这样做会导致直接使用 Diffie-Hellman 值 g^{xy} 本身 (它不是均匀随机或伪随机字符串) 作为 HMAC 的密钥 PRK。相反, HKDF 应该对 g^{xy} 应用提取步骤 (最好使用盐值), 并在扩展部分使用结果 PRK 作为 HMAC 的密钥。
在所需密钥位数 L 不超过 HashLen 的情况下, 可以直接使用 PRK 作为 OKM。然而, 这不推荐, 特别是因为它会省略将 'info' 用作派生过程的一部分 (并且不建议将 'info' 作为提取步骤的输入添加 -- 请参见 [HKDF-paper])。
3.4. The Role of Independence (独立性的作用)
密钥派生函数的分析假设输入密钥材料 (IKM) 来自某个源, 该源被建模为一定长度的比特流上的概率分布 (例如, 由熵池产生的流、从随机选择的 Diffie-Hellman 指数派生的值等); IKM 的每个实例都是从该分布中抽样的样本。密钥派生函数的一个主要目标是确保, 当将 KDF 应用于从 (相同) 源分布中采样的任何两个值 IKM 和 IKM' 时, 结果密钥 OKM 和 OKM' 在本质上彼此独立 (在统计或计算意义上)。为了实现这一目标, 重要的是从适当的输入分布中选择 KDF 的输入, 并且独立地选择输入 (从技术上讲, 即使在以其他 KDF 输入为条件时, 每个样本也必须具有足够的熵)。
独立性也是提供给 KDF 的盐值的一个重要方面。虽然无需保持盐值的秘密, 并且相同的盐值可以与多个 IKM 值一起使用, 但假设盐值独立于输入密钥材料。特别是, 应用需要确保盐值不是由攻击者选择或操纵的。例如, 考虑 (如在 IKE 中) 盐值是从密钥交换协议中各方提供的随机数派生的情况。在协议可以使用这样的盐值派生密钥之前, 它需要确保这些随机数被认证为来自合法方, 而不是由攻击者选择的 (例如, 在 IKE 中, 这种认证是认证的 Diffie-Hellman 交换的一个组成部分)。