485 / 736MIX-H

Entropy Mixing

熵混合

Entropy Mixing 在创建秘密时组合多个输入。它可能有帮助,但两个来源并不自动意味着两倍的安全性。关键是攻击者知道什么,以及这些来源之间有什么关联。

Entropy Mixing 是生成器共同处理多个输入的过程。它可以利用不同来源的不确定性,而不只依赖一个来源。但增加数据不等于增加熵:复制已知信息不会带来新的秘密。安全性取决于具体来源,以及经过验证的组合方法。

设想同一事件有两份记录。文件名虽然不同,第二份记录却没有增加独立的未知信息。同样,网络数据包到达时间与磁盘访问时间也可能相关。NIST SP 800-90B 提醒,不能简单相加相互依赖来源的熵估计。首先要弄清:当攻击者也知道其他输入时,还有什么是不确定的。 [1]

哈希是根据数据计算出的指纹。 但如果攻击者知道全部输入,就能算出相同结果。更长的哈希和额外的公开常量都不会把已知数据变成秘密。RFC 4086 区分了混合已有的不确定性与以确定性方式产生更多数值。正确设计的混合能够利用来源真正提供的熵,却不能弥补本来不存在的熵。 [2]

XOR 比较两个比特:相同得到 0,不同得到 1。因此 X XOR X = 0:把一个值与自身的副本混合,在这里会消除全部不确定性。反过来,如果一个输入均匀随机且独立于另一个输入,结果仍然均匀。RFC 4086 用此说明前提条件的重要性。这不是自行制作钱包生成器的教程。 [2]

评估具体方案时,要问输入从哪里来,以及攻击者能对它们做什么。HKDF 是派生密码学密钥的方法,它使用名为 salt 的辅助输入。这个输入不必保密,但 RFC 5869 假设它独立于初始密钥材料,并要求应用防止攻击者选择或修改它。这里的 Salt 是参数名。来源清单或看似随机的结果,本身都不能保证某个来源失效时系统仍然安全。 [4]

NIST SP 800-90B 以一个主要噪声源为基础。它允许把其他来源的输出接到主要来源的数据后面,前提是这些数据一起经过认可的处理方法,也就是 conditioning。但在这种评估方式下,额外来源不会被计入更多熵。因此,输入变多并不自动提高认可的数值。这是特定评估的规则,并非说其他来源永远无用。 [1]

OpenSSL 3.5 能说明两者的区别。它是供程序执行加密、生成随机数等操作的密码学库。RAND_add() 函数混入缓冲区中的数据,缓冲区就是用于存放这些数据的一块内存。num 表示读取多少字节;randomness 以字节为单位估计其中的熵,范围从零到 num。内存区域的大小不能证明这个估计正确。默认生成器通常会自动初始化,并自动从系统来源补充熵。 [3]

向生成器补充新的熵称为 reseeding。这与加入任意数据不同。OpenSSL 3.5 文档说明,在遵循密码模块规则的 FIPS 模式下,应用提供的数据不被认可为可信熵源。它们只作为附加输入混入,不算完整的 reseed。因此,仅调用 RAND_add() 并不能证明已经完成这种更新。 [3]

RFC 5869 中的 HKDF 把工作分成 HKDF-Extract 和 HKDF-Expand。第一步把输入中可用的熵集中到一个中间密钥里,第二步从它派生出所需长度的数据。这个过程没有获得新的独立秘密。info 参数可以把结果与用途关联起来,例如标明派生密钥用来做什么。这样的上下文不能代替优质初始数据,也不能证明产生了新熵。 [4]

要获得更完整的理解,请将本词条与以下词条结合阅读: Cryptographic Entropy, CSPRNG, True Random Number Generator, Seed Generation. 反向关联还来自: Dice Roll Entropy, True Random Number Generator.

DOC · 001NIST SP 800-90B — Additional noise sources规范 DOC · 002RFC 4086 — Mixing and randomness requirements规范 DOC · 003OpenSSL 3.5 — RAND_add and FIPS reseeding文档 DOC · 004RFC 5869 — HKDF extraction, expansion and independence规范
修订日期: 来源优先 · 非投资建议