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。兩者皆可將新簽名私鑰保留於獨立裝置。購買並不修復舊私鑰:請在裝置上建立全新錢包。
Amazon 連結開啟區域產品搜尋,非驗證賣家列表。請對照 Trezor 官方 Amazon 商店或授權經銷商檢查賣家。設置時使用裝置驗證檢查;切勿使用附帶的預寫錢包備份。
- 從 trezor.io/start 開始並安裝 Trezor Suite。遵循裝置專屬設置與驗證檢查,選擇 Create a new wallet 並完成裝置上的備份檢查。請離線保存備份。不要將上述範例的舊錢包或軟體錢包助記詞還原至此裝置。
- 一般發送時,在 Trezor Suite 選擇 Bitcoin 帳戶,選擇 Receive 並在連接裝置上驗證完整地址。使用此地址替代 Blockchain.com 路徑中的軟體錢包地址。 請在 Trezor Suite 中檢查入帳情況及其確認次數,而不是在 Electrum 的 History 中檢查。
- Electrum Sweep 路徑中,連接新配置的 Trezor,並使用 File → New/Restore → Standard wallet → Use a hardware device 建立 Electrum 錢包。遵循 Trezor 的 Electrum 指南,使用相符的 Bitcoin 帳戶與地址類型。在 Trezor 上驗證接收地址,然後用作掃描目的地。僅在 Sweep 中輸入舊 WIF 私鑰;切勿將 Trezor 備份詞輸入 Electrum 或網站。
來源與範圍
本案例研究涵蓋歷史瀏覽器實作及其不同遷移路徑。欲了解熵、助記詞與硬體錢包間更廣泛關係,請參閱背景文章。
- Unciphered — Randstorm 披露,2023 年 11 月 14 日
- bitaddress.org — 簽名版本歷史
- Coinpunk — RNG 與倉庫快照檢查 · 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 助記詞。請保留備份、登入識別碼與密碼。使用版本專門知識本地恢復私鑰,並與原地址匹配後,再使用掃描路徑。