什么是熵?加密货币安全背后的随机性
目录
每一个加密货币钱包都始于一个随机数。不是你选择的密码,不是你设计的模式,而是从物理世界中提取的原始随机性。这种随机性被称为熵,它是决定你的加密资产是安全还是脆弱的最重要因素。
如果钱包背后的熵是强的,攻击者需要搜索比可观测宇宙中的原子数量还多的组合才能找到你的密钥。如果熵是弱的,你的资金可以在几秒内被盗。没有中间地带。
熵的定义¶
在密码学中,熵衡量数据的不可预测性。它以比特为单位量化。一比特的熵代表一个二元选择:正面或反面,0或1。两比特的熵给你四种可能的结果。三比特给你八种。每增加一比特,可能性的数量就翻倍。
公式很简单:n 比特的熵产生 2^n 个可能的值。
这种指数增长使熵如此强大。在较小的数字时,可能性似乎可以管理。在加密货币使用的比特数下,它们变得大到无法理解。
加密货币语境中的熵不是隐喻或抽象概念。它是一个特定的、可测量的随机性量,被输入确定性算法以产生你的助记词、私钥,以及最终的地址。初始熵之后的一切都是数学派生的。熵本身是唯一必须是真正随机的部分。
128位 vs 256位¶
BIP39 标准定义了助记词的生成方式,支持两种主要的熵长度:
128位(12词助记词)¶
- 产生 2^128 个可能的助记词
- 即 340,282,366,920,938,463,463,374,607,431,768,211,456 种组合
- 大约 3.4 x 10^38
256位(24词助记词)¶
- 产生 2^256 个可能的助记词
- 大约 1.16 x 10^77 种组合
- 超过可观测宇宙中估计的原子总数
两个级别都被认为对当前技术是安全的。128位熵是大多数消费者钱包的标准,没有已知的计算方法可以在任何实际时间框架内搜索 2^128 种可能性。256位选项为那些希望获得最大保护或担心未来计算进步的用户提供了额外的安全裕度。有关详细比较,请参阅暴力破解助记词需要多长时间?。
熵比特数和词数之间的关系遵循一个简单规则:每11比特的熵映射到 BIP39 词表中的一个词(2,048个词,而 2^11 = 2,048)。12词短语编码128位熵加上4位校验和。24词短语编码256位熵加上8位校验和。有关此过程的完整分解,请阅读 BIP39 详解。
随机性来源:硬件 RNG 和 Web Crypto API¶
关键问题是:熵从哪里来?并非所有随机数生成器都是一样的。
伪随机 vs 密码学安全¶
标准编程随机函数(如 JavaScript 的 Math.random())是伪随机的。它使用数学公式产生看似随机但完全确定的数字。给定相同的起始种子,它每次都会产生相同的序列。这对于生成加密货币密钥来说是灾难性的不适用。
密码学安全的随机数生成器(CSPRNG)通过从硬件源引入真正的物理随机性来解决这个问题。
硬件随机数生成器¶
现代 CPU 包含专用的硬件随机数生成器,从物理现象中收集熵:
- Intel RDRAND/RDSEED:使用硅电路中的热噪声
- ARM TrustZone TRNG:利用硬件级随机位生成
- 操作系统级熵池:Linux 的
/dev/urandom、Windows 的 CryptGenRandom 和 macOS 的 SecRandomCopyBytes 都维护由硬件事件(如中断时序、磁盘寻道变化和网络数据包到达时间)馈送的熵池
这些物理源产生的随机性即使攻击者完全了解系统的软件状态也无法预测。
Web Crypto API¶
对于基于浏览器的工具,Web Crypto API 通过 crypto.getRandomValues() 提供对操作系统密码学随机数生成器的访问。该函数由 W3C 规定并在所有现代浏览器中实现。它从原生应用程序使用的同一操作系统级熵池中获取数据。
SafeSeed 使用 Web Crypto API 进行所有密钥生成。当你使用 Bitcoin 助记词生成器或 Ethereum 助记词生成器时,熵通过 crypto.getRandomValues() 获取,直接从你设备的硬件提供密码学安全的随机字节。没有任何内容在服务器上生成;一切都在你的浏览器中运行。
Web Crypto API 与 Math.random() 不同。它是一个从根本上不同的系统,专门为密码学操作设计。这种区别非常重要:Math.random() 在大多数实现中大约有52位内部状态,这意味着观察到几个输出的攻击者就可以预测所有未来的输出。crypto.getRandomValues() 没有这样的弱点。
从熵到助记词¶
从原始熵到助记词的过程遵循 BIP39 规范定义的精确、确定性路径:
步骤 1:生成随机字节¶
CSPRNG 产生16字节(128位)或32字节(256位)的随机数据。
步骤 2:计算校验和¶
计算熵的 SHA-256 哈希。该哈希的前4位(对于128位熵)或前8位(对于256位熵)作为校验和附加到熵后面。
步骤 3:分割为11位组¶
组合的熵 + 校验和位被分成每组11位。对于12词短语:128 + 4 = 132位,分成12组,每组11位。
步骤 4:映射到词语¶
每个11位值(0-2047)用作 BIP39 词表(2,048个词)的索引。结果就是你的助记符短语。
步骤 5:派生种子¶
助记符短语通过 PBKDF2-HMAC-SHA512 进行2,048次迭代以产生512位种子。然后使用该种子按照 BIP44 派生路径派生你的 HD 钱包树。
步骤1之后的每一步都是确定性的。相同的128位熵将始终产生相同的12个词、相同的种子和相同的地址。整个系统的安全性取决于那些初始随机字节的不可预测性。
当弱熵导致资金被盗¶
弱熵的后果不是理论性的。多个现实世界的事件已经证明了随机性失败时会发生什么。
Android SecureRandom 漏洞(2013年)¶
2013年8月,Android 的 SecureRandom 实现中发现了一个缺陷。Android 上的 Java 密码学库没有正确地为其随机数生成器播种,导致一些 Bitcoin 钱包生成了熵不足的私钥。攻击者利用这一点从受影响的钱包中窃取了比特币。该漏洞影响了多个钱包应用程序,并导致 Android 生态系统中的紧急修补。
Blockchain Bandit(可预测密钥)¶
安全研究员 Adrian Bednarek 记录了一个案例,攻击者系统性地扫描 Ethereum 区块链,寻找由弱私钥派生的地址。像 0x0000...0001(数字1)这样的密钥或从简单短语派生的密钥被不了解熵的人使用过。自动化机器人监控这些地址,并在几秒内窃取存入的任何资金。数千个以太币从具有可预测密钥的地址中被抽走。
脑钱包攻击¶
脑钱包——私钥从记忆的口令派生——已被反复攻破,因为人类选择的短语的熵远低于人们的想象。攻击者对脑钱包使用的相同派生函数运行大量词典,包括短语、歌词、书籍引言和常见密码。任何人类能记住的短语都可能在这些攻击的搜索空间之内。
这些事件有一个共同的教训:密码学算法本身(SHA-256、secp256k1、ECDSA)没有被破解。输入其中的熵不足。
测试熵的质量¶
如何验证随机数生成器是否产生了高质量的熵?存在几种统计测试:
NIST SP 800-22¶
美国国家标准与技术研究院发布了一套随机性统计测试。这些测试包括频率测试(0和1是否大致平衡?)、游程测试(相同位的序列长度是否符合预期?)和矩阵秩测试等。运行良好的 CSPRNG 应该通过所有这些测试。
Dieharder 测试套件¶
一组扩展的随机性测试,比 NIST 套件更严格地测试生成器。以 George Marsaglia 最初的 Diehard 测试命名,该套件通常用于审查新的随机数生成器。
实际验证¶
对于终端用户,最实用的验证是确保你使用的是经过良好审计的工具,该工具依赖 crypto.getRandomValues() 或等效的操作系统级 CSPRNG。你不应该试图通过添加自己的"随机性"(如自己选择词语)来改善熵,因为人类的选择远不如感觉上那么随机。
SafeSeed 的工具是开源的,这意味着任何人都可以验证熵源是 crypto.getRandomValues() 而不是更弱的替代方案。代码完全在你的浏览器中运行,没有服务器通信,因此中间人没有机会影响随机数生成。有关客户端生成为何重要的更广泛讨论,请参阅在线助记词生成器安全吗?。
熵与你的安全态势¶
理解熵会改变你对加密货币安全的思考方式。你的12词助记词不仅仅是一个方便的备份机制;它是一个随机数的人类可读编码,这个随机数大到宇宙中没有足够的能量来搜索所有可能性。
但这种保护只有在原始随机数是真正随机的情况下才成立。选择生成钱包的工具时:
- 验证熵源:工具应使用
crypto.getRandomValues()、/dev/urandom或等效的硬件支持的随机性。 - 避免自定义熵:不要自己选择词语、用有偏差的方法掷骰子,或使用任何你"感觉"足够好的随机源。
- 使用成熟的标准:BIP39 自2013年以来经过了实战检验。精确遵循 BIP39 的工具,如 SafeSeed 上的 Solana 助记词生成器,继承了十年的安全审查。
- 尽可能离线生成:即使有强熵,在气隙或离线设备上生成密钥也消除了基于网络的攻击向量。请参阅如何离线生成 Bitcoin 助记词了解实用指南。
熵是看不见的。你无法看到它、感受它,或通过查看输出来验证它。从弱熵生成的助记词看起来与从强熵生成的完全相同。确保安全的唯一方法是信任流程:使用经过审计的开源工具,这些工具从硬件支持的随机数生成器中获取数据,永远不要在这个基础上妥协。