比特币的安全性探讨(下篇)魔鬼藏在细节之中
撰文|徐令予
本文的上篇指出:比特币是由 UTXO 组成的系统,而不是“账户余额”系统。每个 UTXO 像一张纸币,它的地址就像纸币上的序列号。钱包不存比特币,钱包存的是私钥。并且又解释了地址、公钥、私钥之间的关系,最后还展现了比特币从 A 转到 B 的整个支付流程。这些内容是理解比特币系统运作的必备知识。
然而,上篇刻意略过了几个关键细节:为什么地址不是公钥本身?为什么比特币地址只用一次?为什么数字签名时还需要一个随机数?数字钱包如何管理无数个地址?但正是这些技术细节为比特币的长治久安提供了安全保障。
下面将围绕这几个核心问题作出较为深入的分析。
第一部分:公钥为何不能直接作为地址?公钥为何延迟公布?
在上篇中我们提到:地址不是公钥,而是公钥的哈希值。从用户角度看,这让地址变成了一串更短、更方便使用的字符串;但真正的原因并不是为了节省空间,而是为了安全。理解这一点可从两个角度入手。
第一点:如果直接用公钥当地址,公钥会一直暴露。
比特币的公钥密码基于椭圆曲线,其安全性依赖于:从公钥推导私钥几乎不可能。在目前的算力资源环境下,这种算法是足够安全的。然而,将来的量子计算机或者GPU集群可能会削弱椭圆曲线的算法安全。公钥暴露次数越多、暴露越早,潜在风险就越大。
因此,比特币采取了一种策略:收款时只公布公钥的哈希值(地址),公钥未暴露。花费时才公布该地址的公钥,而且仅公布一次。
这种做法称为延迟公钥暴露。它的意义在于:公钥仅在必要时短暂暴露,暴露越少、时间越短,对未来攻击的抵抗能力越好。而UTXO一旦花费就立即淘汰,相应的公钥不再被使用。
第二点:为什么地址只用一次?
钱包每次找零都会生成新的地址,而不是复用旧的。这带来三个好处:
因此,一次性地址并不是麻烦,而是为获得安全与隐私双赢的巧妙设计。
第二部分:私钥签名中的随机数 K:为什么 K 如果出问题,钱有可能被偷走?
这是有关比特币的最难解释,但却是必须认真对待的安全隐患。一些交易所、私人钱包,都是因为随机数 K 出问题而造成不可挽回的比特币资产损失。
首先必须理解:数字签名不是直接用私钥对交易内容作运算。实际上,比特币使用的 ECDSA 签名需要一个额外参数:K (一次性随机数)。
签名过程大致是:私钥、随机数 K、交易哈希三者经过数学运算,得到数字签名。
为什么 K 一旦重复或可预测,私钥就会暴露?这是 ECDSA 数学结构决定的。如果攻击者发现两次签名使用了相同的 K,就可以直接计算出私钥。历史上真实案例包括一些比特币库的随机数不安全、某些硬件钱包的硬件泄露、开发者使用固定 K 等等,引发过巨额损失。
k 的随机性对比特币系统特别重要。在传统封闭系统(如银行后台或操作系统内部)中,即使某次签名的 k 出错,也不一定会被攻击者看到,因为数据并不会公开。
但比特币系统却完全不同。比特币的每个签名都会永久公开在区块链上,任何人都能看到你的所有历史签名。攻击者可以无限次分析这些公开数据,只要出现一次 k 弱随机或重复,就能立即利用数学关系推算你的私钥。用户自己生成签名,没有中心化专业机构支持,随机数质量完全取决于用户设备和软件,这会构成安全隐患。
另一个常见误解是:既然地址只用一次,私钥泄露又能怎样?
其实私钥在签名后并不会立即失效。在交易确认之前,私钥仍然代表着该 UTXO 的所有权。如果攻击者在你签名后短时间内推算出私钥,他可以抢先构造另一笔交易,支付更高手续费,矿工就会优先打包他的交易,你的钱会被直接转走。
因此,使用一次性地址并不能降低随机数 K 的安全要求。K 的随机性保护的是当下的安全,而一次性地址保护的是未来的安全,他们防范的是两种不相同的安全隐患,
第三部分:HD 钱包的分层结构:为什么你只需要一组助记词就能管理无数个比特币的地址和相关的私钥?
上篇提过:钱包内部会自动生成新的地址,但没有解释它是如何做到的。这依赖于 HD 钱包的设计。
在早期比特币钱包系统中,一个地址对应一个独立私钥。如果用户有成百上千个地址,就需要保存成百上千个私钥,这既不方便也不安全。
HD 钱包的出现解决了这些问题,HD 钱包的英文全名是 Hierarchical Deterministic Wallet,直译为“分层确定性钱包”。
因此,用户只需保存一组助记词,就可以恢复所有过去所有的地址,不会遗漏任何一枚比特币。这在安全性上有显著优势:
第四部分:比特币系统为何安全?又为何仍然有人被盗走上百亿美元?
通过上、下两篇文章可以得出明确结论:
但为什么仍然会发生交易所巨额失窃?原因十分简单,真正摧毁用户资产的是比特币系统之外的非算法因素,它们包括:
最后的结论是:比特币协议没有问题,问题出在系统之外。数字货币的最大威胁来自设备和人,而不是数学算法。这也与我以前撰写的《150 亿美元比特币被盗案的真相》一文中的观点完全一致。
徐令予 于南加州(2025年11月28日)