Randstorm / BitcoinJS
Randstorm:旧版比特币钱包背后的浏览器漏洞
哪些软件有文档记录,哪些版本重要,以及如何摆脱旧钱包而不携带其易受攻击的密钥。
目录
实际出了什么问题
Randstorm涉及旧版浏览器软件中的密钥生成。JSBN 的 SecureRandom() 可能将不足的熵源与可预测的浏览器 Math.random() 结合使用。Unciphered 于2023年11月14日披露了该问题,并报告了2011–2015年创建的易受攻击钱包。这是一个观察到的时间段,而非对那些年份所有钱包的判决。
SecureRandom 这个名称并不保证安全。在 Coinpunk 检查的源码中,回退机制使用 Math.random() 填充一个256字节的池,混入时钟信息,并输入 Arcfour 生成器。一个大的池无法提供其输入所缺乏的不可预测性。同一源码还包含更强的 Web Crypto 和 Node.js 路径:关键区别在于是否触发回退。
这是私钥选择方式的缺陷。它不是比特币签名验证的破坏。用新版应用打开旧备份会保留那些密钥;将资金转移到独立生成的密钥则改变了授权支出的凭证。
钱包、版本及证据的局限性
请分别阅读库版本和钱包版本。对于托管网站,密钥创建当天提供的代码比今天的应用版本更重要。表格区分了有文档记录的事件和源码发现。
| 项目 | 版本或时间段 | 此项确立的内容 |
|---|---|---|
| BitcoinJS / bitcoinjs-lib | 0.1.3 | 披露中作为示例提及。JSBN 使用至2014年3月;这并不确立所有衍生版本的完整受影响范围。 |
| Blockchain.info Blockchain.com | 历史网页钱包;未验证具体受影响版本范围 | Unciphered 调查起点为一客户钱包。这不意味着所有 Blockchain.com 钱包或当前应用都受影响。 |
| bitaddress.org | 2.6.5 · 2.8.0 2013-12-01 · 2014-01-18 | 2.6.5 版本将 JSBN 更新至1.4。2.8.0 版本增加了全池 Web Crypto 初始化和强制鼠标/键盘熵。这些是有文档记录的变更,不是“所有早期版本易受攻击/所有后期版本安全”的确定界限。 |
| Coinpunk | 0.2.1 63ca325be538 | 检查的代码库快照标记为0.2.1,包含 Math.random()/Arcfour 回退机制及更强路径。这是代码发现,不证明所有部署都使用回退。开发已停止。 |
本概览涵盖此处验证的实现;非详尽受影响钱包列表。未列出的产品不代表自动无影响。旧创建日期或以1开头的地址不足以识别生成器。
目的地准备一次即可
以下三条路径均使用新的 Electrum Desktop 钱包作为目的地。菜单名称参照本文检查的英文4.8.2桌面界面。从官网下载当前版本;4.8.2仅为说明参考,不是永久最低版本。
- 在受信任且已更新的电脑上,下载适合操作系统的 Electrum。遵循官方签名说明,安装前独立核对签名者指纹。
- 选择 File → New/Restore,命名钱包为 randstorm-new,然后选择 Standard wallet → Create a new seed。将新助记词抄写在纸上并确认,设置钱包文件密码。不要导入旧密钥。
- 存入资金前,使用 File → New/Restore → Standard wallet → I already have a seed 创建 recovery-check,仅使用新的纸质备份。通过 View → Addresses 和 Addresses 标签比较两个钱包的第一个接收地址。检查期间保持两个钱包打开。
- 在 randstorm-new 中,使用 Receive → Request(若启用 Lightning 则选择 Onchain)。复制比特币地址。下面的钱包专用路径必须发送到此地址,发送前确认手续费和完整目的地。
Blockchain.info:使用持有旧地址的钱包
此路径适用于仍可通过 Blockchain.com 访问的历史 Blockchain.info 钱包。当前发送说明描述的是今日网页界面,不是未经验证的2012年界面。交易账户余额是不同产品。
- 保留原始加密备份和登录记录。在网页钱包中,检查 Settings → Wallets & Addresses → Bitcoin 是否有单独导入的地址。将已知旧公钥地址与显示余额匹配;新的恢复短语不应假定涵盖导入密钥。
- 在钱包仪表盘打开 Send,选择 Bitcoin,输入新的 Electrum 地址作为外部目的地。先发送少量,选择 Continue,核对地址、金额和手续费,然后 Send。
- 在 Electrum 的 History 等待确认。然后发送剩余可用余额,扣除手续费。分别检查每个单独资金的导入地址;成功测试并不代表旧钱包已清空。停止使用所有废弃接收地址。
bitaddress.org:用 Sweep 转移纸钱包
bitaddress 打印件通常代表单个密钥,而非现代恢复短语。请保留纸质和任何原始 HTML 文件:文件名或页脚可能标识版本。版本历史有助于重建设置,但不认证单个密钥。
- 识别私钥,而非公钥接收地址。主网 WIF 通常以5、K或L开头;BIP38加密密钥以6P开头。前缀仅为格式提示。保持原始压缩形式,因为它决定对应地址。
- 对于 BIP38,先使用官方 bitaddress 仓库的验证副本本地离线解密:Wallet Details → 输入加密密钥 → View Details → 输入密码 → Decrypt BIP38。解密后比对地址与纸质备份,确认匹配后再使用对应 WIF。切勿在在线网站输入密钥或用此旧工具生成替代钱包。
- 在新的 Electrum 目的地钱包中,打开 Wallet → Private keys → Sweep。仅在此本地对话框输入未加密的 WIF。确认目的地属于 randstorm-new,核对交易和手续费后广播。
- Sweep 一次性转移由提供密钥控制的可用余额。它不是导入,也不是上述小额测试。对其他有资金的纸钱包密钥重复此操作,确认所有预期收款后保留原件。
Coinpunk:在操作旧服务器前先保护备份
Coinpunk 是自托管的,因此没有统一的当前登录网站或恢复服务。标签来自仓库快照63ca325be538,其 package.json 声明版本为0.2.1。修改部署可能不同。
- 如果原始可信安装仍可用,打开 Backup → Download,保存多个加密钱包副本。也保留登录标识、密码和服务器备份。不要先更新或重装唯一存活的实例。
- 历史 Send Bitcoins 表单包含 Bitcoin address to send to、Amount 和显示的手续费。仅当原实例仍可靠运行且支持目的地址时使用。不要强制使用 bc1 地址;检查的地址解析器使用 Base58Check。
- 对于不兼容目的地或离线服务器,保留备份并借助理解该 Coinpunk 版本的工具本地恢复密钥。钱包模型将 keyPairs(包括找零密钥)存储在加密负载中。这不是 Electrum 助记词或 Bitcoin Core 的 wallet.dat;重命名文件无法转换格式。
- 恢复的 WIF 密钥与原地址匹配后,使用 Electrum 的 Sweep 过程转移每个有资金的密钥。检查完整集合,包括找零地址。保留加密备份及密码,直到目的地收款与预期余额一致。
我们推荐作为新目的地的硬件钱包
本次迁移推荐 Trezor Safe 3(偏好实体按钮者)或 Trezor Safe 5(更大触摸屏便于地址核对者)。两者均可将新签名密钥保存在独立设备上。购买设备不会修复旧密钥:请在设备上创建全新钱包。
亚马逊链接打开区域产品搜索,而非认证卖家列表。请核对卖家是否为 Trezor 官方亚马逊店铺或授权经销商。设置时使用设备认证检查;切勿使用附带的预写钱包备份。
- 访问 trezor.io/start 并安装 Trezor Suite。按照设备特定设置和认证检查,选择 Create a new wallet 并完成设备上的备份检查。保持备份离线。不要将上述示例中的旧钱包或软件钱包助记词恢复到此设备。
- 正常发送时,在 Trezor Suite 选择 Bitcoin 账户,选择 Receive 并在连接设备上核实完整地址。使用此地址替代 Blockchain.com 路径中的软件钱包地址。 请在 Trezor Suite 中检查到账情况及其确认次数,而不是在 Electrum 的 History 中检查。
- Electrum 扫入路径中,连接新配置的 Trezor,创建 Electrum 钱包:File → New/Restore → Standard wallet → Use a hardware device。遵循 Trezor Electrum 指南,使用匹配的比特币账户和地址类型。在 Trezor 上核实接收地址,作为扫入目的地。仅在 Sweep 中输入旧 WIF 密钥;切勿在 Electrum 或网站输入 Trezor 备份词。
来源与范围
本案例研究涵盖历史浏览器实现及其不同迁移路径。关于熵、助记词和硬件钱包的更广泛关系,请参阅背景文章。
- Unciphered — Randstorm 披露,2023年11月14日
- bitaddress.org — 签名版本历史
- Coinpunk — 检查的随机数生成器及仓库快照 · package.json · README
- Electrum — 恢复、扫入及隐私常见问题
- Electrum 4.8.2 — 桌面钱包向导 · Desktop menus
- Blockchain.com — 导入的比特币地址
- bitaddress.org — BIP38 和 Wallet Details 实现
- Coinpunk — 加密钱包模型及找零密钥 · Backup · Send
- Trezor Safe 3
- Trezor Safe 5
- Trezor Suite — trezor.io/start
- Trezor — 官方商店及授权经销商
- Trezor — 从其他钱包迁移
- Trezor Suite — 接收并核实地址
2026年9月19日核查,依据主要文档和源码。测试未使用真实资金或私钥。表格非详尽列表,也非钱包诊断。
常见问题
BitcoinJS 0.1.3 能识别我的钱包版本吗?
不能。它识别的是 Randstorm 披露中引用的库示例。钱包可能捆绑或修改该库而不向用户暴露版本。仍需识别原钱包构建和浏览器环境。
bitaddress.org 2.8.0 能证明我的纸钱包安全吗?
更新日志记录了2.8.0中更强的熵收集。它不认证单个密钥的生成方式、浏览器功能或文件是否被修改。因此文章将其视为有文档记录的变更,而非普适安全界限。
为什么纸钱包路径用 Sweep 而不用 Import?
Import 保留原私钥使用。Sweep 创建交易,将可用资金转移到准备好的目的地钱包。新钱包必须有独立生成的密钥,且发送前需核对目的地和手续费。
Electrum 能直接打开 Coinpunk 备份吗?
检查的 Coinpunk 版本存储加密钱包负载,不是 Electrum 助记词。保留备份、登录标识和密码。用版本特定方法本地恢复密钥,再与原地址匹配后使用扫入路径。