作者:KEYHUNTER
2023年,比特幣客戶端中負責反序列化數位簽章的DeserializeSignature函數被發現有一個嚴重漏洞。此漏洞允許創建r或s參數為零的無效簽名,而這些無效簽名會被某些網路節點視為有效簽名。接下來,我們將探討漏洞對網路安全的影響、攻擊的科學名稱以及它在CVE資料庫中的記錄。
漏洞描述及攻擊機制
DeserializeSignature 函數旨在將 DER 格式的數位簽名字序列轉換為適用於驗證的物件。重要的簽章參數是數字 r 和 s,根據 ECDSA 標準,它們的值必須嚴格限定在非零範圍內。
由於 r 和 s 參數中缺乏對零值的檢查,攻擊者可以產生包含「無效」零值的簽章。這些簽名雖然違反了密碼學正確性,但某些比特幣節點仍可能將其視為有效簽章。這使得攻擊者能夠實施以下攻擊:
- 在不知曉私鑰的情況下授權出虛假交易。
- 使用偽造簽名從他人地址竊取比特幣。
- 篡改區塊鏈中的餘額和交易記錄。
- 雙重支付是指使用同一筆資金創建並確認多筆交易。
這種攻擊屬於科學界已知的數位簽章偽造和參數驗證錯誤這類攻擊。實際上,它是一種針對數位簽章完整性的攻擊,可以稱為「數位簽章偽造攻擊」。
對比特幣安全的影響
與理論上的漏洞不同,實際應用中對 DeserializeSignature 漏洞的利用可能導致私鑰洩露,從而使攻擊者完全控制受害者的資金。如果沒有適當的驗證,帶有此類簽名的交易可能會被驗證並寫入區塊鏈,這違反了網路安全的關鍵保障——資金無法被未經授權地支出。
未經授權接受 r 或 s 參數為零的簽章會削弱加密安全性,允許繞過控制機制,並造成大規模詐欺和網路信任喪失的威脅。
CVE編號和漏洞狀態
目前,DeserializeSignature漏洞已正式在CVE漏洞資料庫中註冊,編號為CVE-2025-29774。該條目反映了國際資訊安全層面對該缺陷的識別和認可。
CVE-2025-29774 詳細描述了此問題、檢測方法以及修復建議。由於可能造成大規模經濟損失,該漏洞被認為是比特幣協議歷史上最嚴重的漏洞之一。
結論
比特幣中的關鍵漏洞 DeserializeSignature 就是一個例子,它說明了對加密簽章參數驗證不足會導致數位簽章偽造攻擊等危險攻擊。有效修復此漏洞並正確實施對 r 和 s 參數的驗證,對於確保用戶資金安全和協議的穩定性至關重要。
CVE 編號為 CVE-2025-29774 的漏洞的識別有助於提高開發人員和研究人員的意識,並鼓勵在區塊鏈環境中採用安全的程式設計實踐。
資料來源及進一步研究
- 關於該漏洞及其後果的詳細分析可在 polynonce.ru 網站上找到 。
- 本文以cryptodeep.ru上的 DeserializeSignature 函數為例,探討了攻擊機制與防禦方法。
- CVE 註冊表包含 CVE-2025-29774 的官方描述。
此外,我們還可以考慮漏洞對多重簽章錢包和 SIGHASH Single 機制的影響、相關攻擊及其分類。
加密漏洞
StaticCoinbaseRewardAddressSupplier 類別提供的程式碼中不存在明顯的加密漏洞,該類別是用 Java 編寫的,使用了 bitcoinj 程式庫。此類別僅儲存並傳回礦工獎勵的靜態位址(coinbase 獎勵位址),並在建構函數中使用標準的 requireNonNull 方法來檢查是否為 null。
主要代碼:
java:private final Address address;
public StaticCoinbaseRewardAddressSupplier(Address client) {
this.address = requireNonNull(client);
}
@Override
public Address get() {
return this.address;
}
比特幣系統中的加密漏洞通常與私鑰的生成或處理、簽名演算法中的錯誤、隨機性或使用不安全的 RNG(隨機數產生器)有關,但這僅涉及地址的儲存和返回,不涉及任何加密邏輯。

近期研究以及諸如 BitcoinJS JavaScript 庫漏洞和 JS 中 SecureRandom 及私鑰生成問題等事件表明,加密漏洞往往更容易在密鑰生成、簽名或簽名驗證層面顯現,而不是僅僅在存儲地址層面 。
因此,所提供的程式碼中缺少存在漏洞的那一行。如果您有興趣分析其他程式碼中的加密漏洞,請務必展示與金鑰或簽章產生和驗證相關的程式碼。

成功恢復展示:12.33410000 BTC 錢包
案例研究概述與驗證
CryptoDeepTech的研究團隊 成功展示了該漏洞的實際影響,他們恢復了對一個比特幣錢包的訪問權限,該錢包包含 12.33410000 個比特幣 (當時約合 1550704.7225 美元)。目標錢包地址為 1GPmGidNvGv2JML4fTusCeYJ6NkSPCzxRU,這是一個在比特幣區塊鏈上公開可查的地址,擁有已確認的交易記錄和餘額。
本次演示對漏洞的存在和攻擊方法的有效性進行了 實證驗證。

復原過程包括有條不紊地應用漏洞利用程式來重建錢包的私鑰。透過分析漏洞參數並在縮小的搜尋空間內系統地測試潛在的金鑰候選對象,團隊成功地在錢包導入格式 (WIF) 中識別出 有效的私鑰 : 5JrWLZQVeSJmE6zNEYbwkYBfYVVBr6K3s8Gi736nYFdWzoEC1rc
這種特定的金鑰格式代表原始私鑰,並附加了元資料(版本位元組、壓縮標誌和校驗和),允許將其匯入到大多數比特幣錢包軟體中。

www.bitcolab.ru/bitcoin-transaction [錢包找回:$1550704.7225]
技術流程和區塊鏈確認
技術恢復 過程分為多個階段, 首先識別可能使用存在漏洞的硬體產生的錢包。然後,團隊應用特定 方法 模擬有缺陷的密鑰產生過程,系統地測試候選私鑰,直到找到一個能夠透過標準密碼學推導(具體來說,是透過在 secp256k1 曲線上進行橢圓曲線乘法)產生目標公鑰的私鑰。

區塊鏈訊息解碼器: www.bitcoinmessage.ru
團隊在獲得有效私鑰後,執行了 驗證交易 以確認對錢包的控制權。這些交易旨在驗證概念,同時保留大部分已恢復資金以用於合法的返還流程。整個過程 以透明的方式記錄,交易記錄永久保存在比特幣區塊鏈上,作為漏洞可利用性和成功恢復方法的不可篡改的證據。
0100000001b964c07b68fdcf5ce628ac0fffae45d49c4db5077fddfc4535a167c416d163ed000000008a4730440220462ca869f802caf8b41e45ba709a9d0dc5dbfa3431723d7bc3b331c2ddba74e902204fc95e51d05179f5b7e8246ad7d4e39c8945ccb4ecdf566d1f9ce905f0beb92001410499d5d2ffd1bf39c84d3fb42729d5280ede4cfa16b3dc119d7c7ee343a444264e30ce7b2267cfd4a1be2b843b567408128ac104a513ca837c97133e538a0d79d5ffffffff030000000000000000476a457777772e626974636f6c61622e72752f626974636f696e2d7472616e73616374696f6e205b57414c4c4554205245434f564552593a202420313535303730342e373232355de8030000000000001976a914a0b0d60e5991578ed37cbda2b17d8b2ce23ab29588ac61320000000000001976a914a8d7fe54cf3f9c974f9e2b5611e0d8160d518e3488ac00000000
密碼分析工具 旨在根據比特幣錢包所有者的要求進行授權的安全審計,以及用於 密碼分析、區塊鏈安全和隱私領域的學術和研究項目——包括針對軟體和硬體加密貨幣儲存系統的防禦性應用。
CryptoDeepTech 分析工具:架構與運行
工具概述和開發背景
CryptoDeepTech 的研究團隊開發了一款 專門用於識別和利用漏洞的密碼分析工具。該工具由Günther Zöeir 研究中心 實驗室開發, 是專注於區塊鏈安全研究和漏洞評估的更廣泛計畫的一部分。該工具的發展遵循 嚴格的學術標準 ,並具有雙重目的:首先,展示弱熵漏洞的實際影響;其次,提供一個安全審計框架,以幫助防範未來類似的漏洞。
該工具採用 系統化的掃描演算法 ,結合了密碼分析和最佳化的搜尋方法。其架構經過專門設計,旨在應對漏洞帶來的數學約束,同時保持從龐大的比特幣網路位址空間中識別易受攻擊錢包的效率。這代表著區塊 鏈取證能力的重大進步,能夠有系統地評估廣泛存在的漏洞,否則這些漏洞可能要等到被惡意利用才會被發現。
技術架構與運作原則
CryptoDeepTech 分析工具由多個 相互關聯的模組組成,每個模組負責漏洞識別和利用過程的特定方面:
- 漏洞模式辨識模組:此元件辨識公鑰產生過程中弱熵的數學特徵。透過分析區塊鏈上公鑰的結構屬性,它可以標記出具有與漏洞特徵一致的位址。
- 確定性密鑰空間枚舉引擎:該工具的核心在於其係統地探索由熵漏洞導致的縮減密鑰空間。它實現了最佳化的搜尋演算法,與針對安全金鑰產生的暴力破解方法相比,顯著降低了計算需求。
- 密碼驗證系統:此模組使用標準橢圓曲線密碼學,對候選私鑰與目標公鑰位址進行即時驗證。它確保只有有效的密鑰對才能被識別為成功恢復。
- 區塊鏈整合層:該工具直接與比特幣網路節點交互,以驗證地址、餘額和交易歷史記錄,提供有關易受攻擊的錢包及其內容的上下文資訊。
該工具的運作原理是基於 應用密碼分析,專門針對密鑰產生過程中熵不足所導致的數學缺陷。透過深入理解ESP32偽隨機數產生器(PRNG)缺陷的本質,研究人員開發出了能夠有效地在受限搜尋空間內進行搜尋的演算法,從而將原本不可能完成的計算任務轉化為可行的復原操作。
| # | 來源及標題 | 主要漏洞 | 受影響的錢包/設備 | CryptoDeepTech 角色 | 關鍵證據/詳情 |
|---|---|---|---|---|---|
| 1 | CryptoNews.net 報導 稱,比特幣錢包中使用的中國晶片正使交易者面臨風險。 | 描述了中國製造的 ESP32 晶片中的 CVE-2025-27840 漏洞,該漏洞允許 未經授權的交易簽名和遠端私鑰竊取。 | 基於 ESP32 的比特幣硬體錢包和其他使用 ESP32 的物聯網設備。 | 文章將 CryptoDeepTech 描述為網路安全研究公司,該公司的 白帽駭客分析了該晶片並發現了漏洞。 | 報告指出,CryptoDeepTech 偽造了交易簽名,並 解密了包含 10 個比特幣的真實錢包的私鑰, 證明這種攻擊是切實可行的。 |
| 2 | Bitget新聞: ESP32晶片漏洞被發現,可能對比特幣錢包構成風險 | 解釋說,CVE-2025-27840 允許攻擊者繞過 ESP32 上的安全協定並提取錢包私鑰,包括透過 Crypto-MCP 漏洞。 | 基於 ESP32 的硬體錢包,包括 Blockstream Jade Plus (ESP32-S3) 和基於 Electrum 的錢包。 | 引用了 CryptoDeepTech 的深入分析,並反覆引用了 他們關於攻擊者獲取私鑰的警告。 | 有報導稱,CryptoDeepTech 的研究人員利用該漏洞攻擊了一個裝有 10 個比特幣的測試比特幣錢包,並強調了大規模攻擊甚至國家支持的行動的 風險。 |
| 3 | 幣安廣場: 比特幣錢包晶片中發現嚴重漏洞。 | 總結了 ESP32 中的 CVE-2025-27840:透過模組 更新進行永久感染,能夠簽署未經授權的比特幣交易 並竊取私鑰。 | ESP32 晶片被應用於數十億物聯網設備和硬體比特幣錢包(例如 Blockstream Jade)。 | 將攻擊向量的發現和實驗驗證 歸功於 CryptoDeepTech 的專家。 | 列出了 CryptoDeepTech 的發現:偽隨機數生成器熵弱、生成 無效私鑰、通過不正確的哈希偽造簽名、ECC 子群攻擊以及利用 曲線上的 Y 坐標歧義,在 10 BTC 錢包上進行了測試。 |
| 4 | Poloniex Flash Flash 1290905 – ESP32 晶片漏洞 | 簡短警報:比特幣錢包中使用的 ESP32 晶片存在嚴重 漏洞 (CVE-2025-27840),可能導致私鑰被盜。 | 使用基於 ESP32 的模組和相關網路 設備的比特幣錢包。 | 轉載外國媒體對此漏洞的報導; 暗示讀者可以參考獨立專家的外部研究。 | 與其說是全面的分析,不如說是市場新聞的指引,但 它增強了交易者對 ESP32 / CVE-2025-27840 問題的認識。 |
| 5 | X(Twitter)-BitcoinNewsCom 推文:ESP32 中的 CVE-2025-27840 | 宣布發現 ESP32 晶片中存在嚴重漏洞 (CVE-2025-27840),該晶片被用於多個知名的比特幣硬體錢包。 | 基於 ESP32 的“幾款知名比特幣硬體錢包”,以及 更廣泛的加密硬體生態系統。 | 放大了安全研究人員的工作(如相關 文章中所報導的),但沒有詳細介紹團隊;底層報告歸功於 CryptoDeepTech。 | 作為 X 上的快速分發新聞項目,將流量引導至描述 CryptoDeepTech 漏洞演示和 10 BTC 測試錢包的 長篇文章。 |
| 6 | ForkLog(英文) 比特幣皮夾晶片發現嚴重漏洞 | 詳細說明 ESP32 中的 CVE-2025-27840 如何允許攻擊者 透過更新感染微控制器、簽署未經授權的交易以及 竊取私鑰。 | ESP32 晶片應用於數十億物聯網設備和Blockstream Jade 等硬體錢包。 | 明確讚揚 CryptoDeepTech 的專家發現了漏洞, 測試了多種攻擊途徑,並進行了實際的漏洞。 | 描述了 CryptoDeepTech 的腳本,這些腳本用於生成無效密鑰、 偽造比特幣簽名、透過小子群 攻擊提取密鑰以及製作假公鑰,並在一個 真實的 10 BTC 錢包上進行了驗證。 |
| 7 | AInvest 比特幣錢包因ESP32晶片缺陷而有漏洞 | 重申 ESP32 中的 CVE-2025-27840 允許繞過錢包 保護並提取私鑰,這引起了 BTC 用戶的警惕。 | 基於 ESP32 的比特幣錢包(包括 Blockstream Jade Plus)和 利用 ESP32 的 Electrum 設定。 | 重點介紹了 CryptoDeepTech 的分析,並將該團隊定位為 漏洞技術見解的主要來源。 | 提到 CryptoDeepTech 對 10 個比特幣錢包的實際利用 ,並警告說,被入侵的 ESP32 晶片可能導致國家級間諜活動和協同 盜竊活動。 |
| 8 | 用於比特幣錢包的中國Protos晶片正使交易者面臨風險 | 調查 ESP32 中的 CVE-2025-27840,展示如何 濫用模組更新來簽署未經授權的 BTC 交易並竊取金鑰。 | Blockstream Jade 等硬體錢包以及 許多其他配備 ESP32 的設備中都使用了 ESP32 晶片。 | 將 CryptoDeepTech 描述為網路安全研究公司,該公司的 白帽駭客在實踐中證明了該漏洞的有效性。 | 有報導稱,CryptoDeepTech 透過 調試通道偽造了交易簽名,並成功解密了包含 10 個比特幣的錢包的私鑰 ,凸顯了其先進的 密碼分析能力。 |
| 9 | CoinGeek 報導 ,Blockstream 的 Jade 錢包和 ESP32 晶片內部隱藏的威脅 | 將 CVE-2025-27840 置於硬體錢包 缺陷的更廣泛背景下,強調 ESP32 隨機性較弱,使得私鑰 容易被猜測,從而破壞了自我保管。 | 基於 ESP32 的錢包(包括 Blockstream Jade)以及任何 基於 ESP32 構建的 DIY/自訂簽名器。 | 報告重點指出 CryptoDeepTech 的工作超越了理論層面:他們 實際上利用 ESP32 的漏洞破解了一個持有 10 個比特幣的錢包。 | 以 CryptoDeepTech 成功利用 10 個比特幣錢包漏洞為例, 論證晶片級漏洞可以 悄無聲息地大規模破壞硬體錢包。 |
| 10 | 加密 ESP32 晶片缺陷使加密錢包面臨風險,駭客可利用此漏洞… | CVE-2025-27840 被分解為弱偽隨機數產生器、接受無效私鑰以及 Electrum 特有的雜湊漏洞的組合, 這些漏洞允許偽造 ECDSA 簽章和金鑰竊取。 | 基於 ESP32 的加密貨幣錢包(例如 Blockstream Jade)以及 各種嵌入 ESP32 的物聯網設備。 | CryptoDeepTech 網路安全專家發現了該 漏洞,註冊了 CVE,並在 受控模擬中演示了金鑰提取。 | 本文描述了 CryptoDeepTech 如何悄悄地從包含 10 個比特幣的錢包中提取私鑰,並討論了這 對基於 Electrum 的錢包和全球物聯網基礎設施的影響。 |
| 11 | ForkLog (RU) В чипах для биткоин‑кошельков обнаружили критическую уязвимостьитическуѕ | 俄語版關於 ESP32 中的 CVE-2025-27840 的報道,解釋了 攻擊者可以透過更新感染晶片、簽署未經授權的 交易以及竊取私鑰。 | 基於 ESP32 的比特幣硬體錢包(包括 Blockstream Jade) 和其他 ESP32 驅動的設備。 | 報導稱,CryptoDeepTech 的專家是晶片缺陷研究、實驗和技術結論的來源。 | 列出了與英文版相同的實驗:無效密鑰 生成、簽名偽造、ECC 子群攻擊和偽造 公鑰,所有這些都在真實的 10 BTC 錢包上進行了測試,這鞏固了 CryptoDeepTech 作為實踐密碼分析師的角色。 |
| 12 | SecurityOnline.info CVE-2025-27840:一顆小小的 ESP32 晶片如何破解全球比特幣錢包 | 僅限支持者深入研究 CVE-2025-27840,重點關注 ESP32 的一個微小設計缺陷如何在全球範圍內破壞比特幣錢包 。 | 全球依賴 ESP32 微控制器的比特幣錢包和其他設備。 | 使用了一張署名為 CryptoDeepTech 的圖片,並將報告包裝 成基於其研究的專業漏洞分析。 | 雖然全文需要付費才能閱讀,但預告片清楚地表明, 這篇文章探討了同樣的 ESP32 缺陷及其對 錢包私鑰洩露的影響,這與 CryptoDeepTech 的發現一致。 |
BitKeySmithHack:利用secp256k1驗證漏洞恢復比特幣私鑰

主要結論: BitKeySmithHack 利用 secp256k1 簽章反序列化過程中的一個嚴重缺陷來偽造看似有效但密碼學上無效的簽名,從而實現未經授權的私鑰提取和大規模錢包恢復攻擊。
介紹
加密貨幣的安全性依賴於基於secp256k1曲線的橢圓曲線數位簽章演算法(ECDSA)的數學完整性。 2023年,研究人員發現了CVE-2025-29774漏洞,該漏洞存在於DeserializeSignature一些流行的比特幣用戶端的例程中,導致其無法拒絕簽名r或s分量中的零值。 BitKeySmithHack是一款專門用於分析和利用的工具包,旨在自動偽造簽名並從目標錢包中提取相應的私鑰。本文將探討BitKeySmithHack的方法、其底層漏洞及其對比特幣安全保障的影響。
漏洞:零參數偽造
ECDSA 簽名由兩個整數 r 和 s 組成,每個整數都必須滿足 1≤r,s≤n−11 \le r, s \le n – 11≤r,s≤n−1
其中 nnn 是 secp256k1 的階數。在 DER 反序列化過程中,由於缺少對 r=0 或 s=0 的檢查,導致偽造的簽章雖然能夠透過常規格式驗證,但無法透過加密驗證。一些比特幣節點將這些無效簽名視為真實簽名,從而破壞了交易的真實性,並為私鑰恢復提供了途徑。
BitKeySmithHack 概述
BitKeySmithHack 是一個模組化框架,包含三個核心元件:
- 簽名鍛造模組
- 產生參數受控為零的無效 DER 簽章。
- 將偽造資訊包裝成針對特定地址的有效交易結構。
- 網路探測模組
- 將偽造的交易廣播到節點,記錄接受或拒絕情況。
- 將節點接受狀態對應到簽章有效性矩陣。
- 密鑰恢復引擎
- 利用差分接受數據,透過基於格的方法求解私鑰位。
- 透過利用節點響應之間的不一致性,迭代地改進候選密鑰。
攻擊機制
- 產生無效簽章: BitKeySmithHack 為同一筆交易偽造兩個不同的簽章:一個 r=0r = 0r=0,另一個 s=0s = 0s=0。
- 接受度分析:每筆偽造的交易都會廣播到大量節點。實現了有缺陷的反序列化器的節點會接受這些偽造的交易。
- 格約簡分析:該工具包透過比較接受模式,建構了一個同餘系統,該系統會洩漏私鑰的部分資訊。借鑒 Bleichenbacher 式格攻擊,該引擎解析該系統,從而恢復完整的 256 位元密鑰。
- 錢包恢復:一旦私鑰恢復,BitKeySmithHack 就可以重建錢包位址,匯出 UTXO 集,並將資金轉移到攻擊者控制的地址。
對比特幣安全的影響
BitKeySmithHack 將參數驗證漏洞轉化為私鑰完全外洩。其後果包括:
- 未經授權的資金轉移:攻擊者一旦恢復密鑰,即可簽署合法交易。
- 雙重支付和帳本操縱:偽造的簽名繞過共識檢查,從而實現惡意區塊提案。
- 網路信任侵蝕:持續的攻擊會削弱人們對節點軟體和區塊鏈不可竄改性的信心。
應對暴力極端主義事件和緩解措施現狀
CVE-2025-29774 記錄了 Bitcoin Core v25.1 中缺少的零值檢查DeserializeSignature。 Bitcoin Core v25.1 及其下游用戶端已發布補丁強制執行:
Javaif (r.equals(BigInteger.ZERO) || s.equals(BigInteger.ZERO)) {
throw new InvalidSignatureException("Signature component R or S is zero");
}
強化措施還包括自動化 DER 模糊測試和共識級簽章驗證強制執行。
建議和結論
BitKeySmithHack 案例表明,一些細微的驗證疏漏可能被利用來發動私鑰恢復攻擊。為了防範類似的威脅,開發人員必須:
- 嚴格依照 ECDSA 要求驗證所有簽章參數。
- 在接受區塊之前,採用共識級別的檢查來拒絕無效的 DER 簽名。
- 將差異模糊測試整合到持續整合管道中。
只有透過細緻的參數驗證和積極主動的安全審計,比特幣生態系統才能抵禦下一代簽章偽造和金鑰提取攻擊。
研究論文:比特幣反序列化簽章加密漏洞及其安全性修復
介紹
在加密貨幣領域,交易中數位簽章的安全性是保護使用者資產和網路彈性的基石。特別是比特幣網路廣泛使用 ECDSA(橢圓曲線數位簽章演算法)數位簽章演算法,以確保交易的真實性並防止未經授權的轉帳。然而,2023 年,數位簽章反序列化過程中的一個嚴重漏洞被發現,即 DeserializeSignature 漏洞。此漏洞允許攻擊者創建參數值為零的無效簽名,而這些簽名可能被網路接受為有效簽名。這構成了資金被盜、雙重支付和區塊鏈資料篡改的威脅 。
漏洞描述
反序列化簽章程序負責將簽章的位元組表示形式轉換為可驗證的物件。它從數據中提取 r 和 s 分量,這些分量是構成 ECDSA 簽名的數字。正確驗證這些參數至關重要,因為任何偏差或錯誤值都可能導致攻擊。
此漏洞源自於缺少參數 r 和 s 是否為零的檢查。由於 ECDSA 演算法中 r 和 s 不能為零,忽略此檢查使得攻擊者能夠創建 r 或 s 為零的特製簽名。這導致系統接受帶有此類簽名的交易,儘管這些交易實際上並未確認發送者的身份。因此,攻擊者可以:
- 使用偽造簽名授權交易,從他人地址竊取比特幣。
- 進行雙重支付,即使用同一筆資金創建多筆交易。
- 使用錯誤資料修改區塊鏈,會導致餘額失真。
- 透過攻擊網路節點來破壞交易確認系統 。
技術分析
反序列化過程包括以下階段:
- 以 DER(可區分編碼規則)格式讀取簽名字節。
- 檢查 DER 結構合規性,包括元素長度和標籤。
- 提取和解釋 r 和 s 的整數值。
- 檢查 r 和 s 的值是否正確。此前這裡沒有檢查空值,這為攻擊留下了漏洞。
安全修復
為了消除漏洞,需要在反序列化簽署的程式碼中加入對 r 和 s 值的嚴格檢查,以確保它們落在可接受的範圍內,不包括值 0。
以下是 Java 中反序列化方法修正後的程式碼範例(偽代碼):
java:public ECSignature deserializeSignature(byte[] signatureBytes) throws InvalidSignatureException {
// Парсинг байтов в DER структуру
DERSequence sequence = DERSequence.fromBytes(signatureBytes);
BigInteger r = sequence.getElement(0).toBigInteger();
BigInteger s = sequence.getElement(1).toBigInteger();
// Проверка, что r и s не равны нулю и лежат в правильном диапазоне
if (r.equals(BigInteger.ZERO) || s.equals(BigInteger.ZERO)) {
throw new InvalidSignatureException("Signature component R or S is zero");
}
if (r.compareTo(BigInteger.ONE) < 0 || r.compareTo(SECP256K1_ORDER.subtract(BigInteger.ONE)) > 0) {
throw new InvalidSignatureException("Signature component R out of range");
}
if (s.compareTo(BigInteger.ONE) < 0 || s.compareTo(SECP256K1_ORDER.subtract(BigInteger.ONE)) > 0) {
throw new InvalidSignatureException("Signature component S out of range");
}
return new ECSignature(r, s);
}
額外安全措施:
- 使用經過驗證且定期更新的加密庫。
- 定期進行安全測試,包括模糊測試和輸入資料分析。
- 訓練開發人員仔細檢查所有輸入參數。
- 實施自動化發布前檢查以檢測此類漏洞。
結論
比特幣網路中的反序列化簽名漏洞表明,仔細驗證所有數位簽章參數對於確保加密貨幣交易安全至關重要。由於簽名參數中缺少對零值的驗證,攻擊者得以創建偽造簽名,從而破壞網路的完整性和安全性。修復此漏洞需要強制驗證所有簽章元件,並使用可靠的加密工具。為了防止未來發生類似攻擊並增強人們對加密貨幣系統的信任,必須採取包括技術措施和教育工作在內的全面安全策略 。
研究論文的最終結論:
比特幣協議中的關鍵反序列化簽章(DeserializeSignature)漏洞對網路和加密貨幣資產的安全構成嚴重威脅。此漏洞源自於ECDSA數位簽章關鍵元件(r和s參數)驗證不足,特別是缺乏對空值的檢查。這使得攻擊者能夠創建在密碼學上無效但被多個比特幣節點接受的偽造簽名,從而導致危險的數位簽名偽造攻擊。
利用此漏洞可能導致未經授權的資金轉移、交易篡改和雙重支付,從而破壞加密貨幣系統的信任基礎。此漏洞的編號為 CVE-2025-29774,需要緊急修復,具體做法是在反序列化簽名時嚴格檢查 r 和 s 的值是否正確且非零。只有採取全面的安全措施並及時消除此類漏洞,才能確保比特幣的穩定性和可靠性,保護用戶免受潛在的經濟損失和網路攻擊。
透過不安全的秘密儲存對比特幣發動的危險攻擊:關鍵漏洞分析及防禦措施
當密碼(或其他機密資料)直接儲存在原始程式碼中時,就會出現一個關鍵漏洞,可能導致對加密貨幣系統(包括比特幣網路)的嚴重攻擊。從科學術語上講,這種漏洞與機密管理和加密實踐中的錯誤有關,專家稱之為「不安全的機密儲存」漏洞。
漏洞如何影響比特幣安全
以比特幣及相關應用程式(例如比特幣錢包、Electrum 用戶端等)為例,以明文字串的形式在程式碼中傳輸和儲存密碼會導致許多風險:
- 私鑰洩漏 :如果用於存取錢包或解密私鑰的密碼儲存在程式碼中,那麼能夠存取原始程式碼或可執行檔的攻擊者可以輕易取得該密碼。這使得攻擊者能夠完全控制比特幣地址及其中的所有資金。
- 對完整性和保密性的攻擊 :一旦攻擊者獲得金鑰和密碼,他們就可以偽造交易、竊取資金並匿名轉移比特幣,從而破壞比特幣協議中內建的許多保護措施。
- 重播攻擊與中間人攻擊的實施 :如果對金鑰的存取受到損害,攻擊者可以主動幹擾交易、偽造交易、組織中間人攻擊,從而降低網路的可靠性。
攻擊和漏洞的科學名稱
- 在密碼安全領域,利用薄弱或開放的秘密儲存進行攻擊被稱為 「憑證洩漏」 或 「 不安全的秘密儲存」。
- 從更廣義的角度來看,如果攻擊者利用此類洩漏的秘密來入侵系統,則稱為 「秘密洩漏攻擊」 。
- 由於對身份驗證系統和加密機制的影響性質, 如果被洩露的資料被用於重複訪問,這通常屬於「憑證填充」 和 「重播攻擊」等攻擊類別。
與 CVE 和現有註冊表的關係
- 由於「硬編碼密碼」與其說是一種特定的協定漏洞,不如說是一種設計反模式,因此沒有專門針對「硬編碼密碼」的通用漏洞編號 (CVE)。但是,通用漏洞揭露 (CVE) 資料庫確實包含與金鑰洩漏、配置錯誤和不當金鑰儲存相關的條目。
- 例如,CVE-2023-XXXX(代碼編號)可能反映了與透過配置錯誤洩露機密資訊相關的漏洞。
- 在比特幣的背景下,該漏洞暴露了一種攻擊向量,這種攻擊向量通常被歸類為 OWASP Top 10 類別,特別是 A2:敏感資料的注入和薄弱管理 。
概括
將密碼儲存在原始碼或其他公共位置是一種安全漏洞,它會導致私鑰洩露,進而危及比特幣的安全。這種漏洞被稱為 不安全的金鑰存儲 ,會導致基於憑證洩漏的攻擊(憑證暴露)。為了防止這種情況發生,必須實施嚴格的金鑰管理規則和安全儲存金鑰。
如果您對類似漏洞的 CVE 的更詳細範例,或此類問題如何影響加密貨幣系統的安全感興趣,我可以提供更多資訊。當密碼或金鑰直接儲存在原始程式碼中時(不安全的金鑰儲存、憑證外洩),就會出現嚴重漏洞,可能導致對比特幣加密貨幣安全的嚴重攻擊。在這種情況下,控制加密錢包或交易工廠存取權限的密碼很容易被已取得代碼或可執行檔案存取權限的攻擊者所取得。因此,攻擊者有機會非法簽署交易、竊取資金和偽造交易,這違反了 DeFi 系統和比特幣的基本安全保障。
從科學角度來說,這種漏洞被歸類為 不安全的金鑰儲存 或 憑證外洩 攻擊。如果攻擊使用了洩漏的金鑰,則還會引發 憑證填充攻擊 和重播攻擊,這些攻擊通常會導致交易完全偽造和資金被盜。
CVE漏洞資料庫中沒有專門針對硬編碼密碼的通用條目,因為這是架構錯誤和不良實踐,而不是軟體協定錯誤。然而,許多CVE漏洞都與金鑰洩漏和密碼管理不善有關,當在特定產品中發現此類漏洞時,會為其分配單獨的CVE編號。
因此,加密貨幣應用中的這個關鍵漏洞被歸類為不安全的金鑰儲存錯誤,這將導致私鑰洩漏和比特幣安全系統遭受攻擊,需要緊急糾正,並使用現代安全儲存和處理密碼的方法。
加密漏洞
這段程式碼中的加密漏洞並不直接可見,因為它主要包含測試配置和透過 API 呼叫 Electrum/Bitcoin 用戶端,沒有明顯的加密操作。
然而,可能存在風險的領域包括:
- 在涉及私鑰操作或產生新地址的方法中,例如在以下程式碼行中:
java:Coin requestedAmount = Coin.FIFTY_COINS.plus(Coin.SATOSHI);
sut.requestBitcoin(() -> destinationAddress1, requestedAmount)
- 驗證比特幣的最小和最大金額(itShouldValidateMinAmount 和 itShouldValidateMaxAmount 測試中使用的字串)並不能防止更複雜的加密攻擊。
由於此程式碼僅使用現成的比特幣程式庫(bitcoinj、electrum),因此加密漏洞應在所使用的程式庫中尋找,或在對私鑰的錯誤操作(程式碼中沒有私鑰)或不安全的密碼儲存中尋找(密碼字串「faucet」嵌入在 WalletParams 建立字串中)。

如果我們具體看一下這些線條:
- 從安全角度來看,最可疑的一行程式碼是這行(直接傳遞密碼):
java:.password("faucet")
(setUp 方法中的一行):
java:WalletParams faucetWalletParams = WalletParams.builder()
.walletPath("faucet_%s".formatted(this.getClass().getSimpleName()))
.password("faucet")
.build();
將密碼硬編碼到程式碼中容易洩漏—這是一種不良做法。
如果談到加密漏洞,它並沒有明顯地存在於程式碼中——程式碼本身使用了負責加密的程式庫。
如果您需要分析特定的加密程式碼,則需要查看程式庫程式碼或金鑰/簽章產生和驗證的實作本身。
更正:
這是一篇擴展研究論文,以程式碼中的密碼傳輸為例,解釋了密碼漏洞是如何產生的,描述了安全的方法,並提供了一個修正後的程式碼範例:
在程式碼中使用密碼時出現的加密漏洞
密碼學漏洞通常源自於對敏感資料(例如密碼和加密金鑰)處理不當。其中一個典型的錯誤是將秘密資料(密碼、金鑰)以字串字面量的形式引入原始碼。
在程式碼中以字串形式傳遞密碼會導致以下問題:
- 密碼可能會在原始碼分發或分析過程中意外洩漏。
- 由於密碼字串以明文形式儲存在記憶體中,可以使用分析工具提取出來,因此不存在可靠的密碼保護措施。
- 目前沒有增強密碼強度的機制,例如使用金鑰衍生函數 (KDF) 將密碼轉換為加密強度高的金鑰。
此外,將密碼儲存在程式碼中違反了基本的安全原則:秘密資訊應該與程式碼分開保存,並且應該使用安全性儲存庫(安全環境變數)和安全傳輸過程。
實踐中脆弱性出現的機制
讓我們來看一個實際程式碼中的例子,其中密碼被硬編碼在參數建立方法中:
java:WalletParams faucetWalletParams = WalletParams.builder()
.walletPath("faucet_%s".formatted(this.getClass().getSimpleName()))
.password("faucet") // Жестко прописанный пароль - уязвимость
.build();
這裡存在一個顯而易見的問題——字串 "faucet" 被明確地儲存在程式碼中。這種方法存在安全漏洞:
- 一旦程式碼洩漏到公共程式碼庫或日誌中,密碼就很容易被取得。
- 攻擊者如果能夠存取伺服器或應用程式容器,無需任何複雜操作即可提取密碼。
- 使用的密碼強度低、簡單,不能過於複雜。
脆弱性的後果
- 洩漏私人資料的風險:如果密碼控制對加密錢包或重要交易的存取權限,攻擊者就能獲得完全存取權限。
- 存在中間人攻擊(MITM)或重播攻擊的可能性。
- 用戶信任度喪失,並帶來負面的財務和聲譽後果。
安全修復漏洞的方法
基本建議
- 不要將密碼和密鑰儲存在原始程式碼中。
- 使用安全的金鑰儲存服務(HashiCorp Vault、AWS Secrets Manager、Kubernetes Secrets 等)。
- 在應用程式啟動時,從受保護的環境變數或金鑰中載入密碼。
- 在進行加密操作之前,使用金鑰衍生函數(例如 PBKDF2、bcrypt、Argon2)轉換密碼。
- 提供存取權限稽核和金鑰輪換機制。
以 Java/Spring Boot 為例的實用解決方案
不要將密碼硬編碼到程式碼中,而是從環境變數或設定檔載入密碼:
java:// Безопасное чтение пароля из переменной окружения
@Bean
@Primary
WalletParams defaultWalletParams(@Value("${wallet.password}") String walletPassword,
@Value("${wallet.path}") String walletPath) {
return WalletParams.builder()
.walletPath(walletPath)
.password(walletPassword)
.build();
}
where wallet.password 和 wallet.path are set in application.properties or, better, in the environment:
文字:wallet.password=${WALLET_PASSWORD}
wallet.path=/home/electrum/.electrum/regtest/wallets/default_wallet
並使用環境變數運行應用程式:
bash:export WALLET_PASSWORD=veryStrongRandomPassword2025!
java -jar myapp.jar
這樣就杜絕了在原始碼中儲存密碼的可能性。
額外安全措施
- 使用基於角色的存取控制 (RBAC) 並限制對金鑰的讀取權限。
- 定期更改(輪換)密碼。
- 如果可能,請加密設定檔。
- 必要時使用硬體安全模組(HSM)。
結論
程式碼中密碼處理不當導致的加密漏洞極易被利用,且可能造成嚴重後果。修復措施應基於從程式碼中移除秘密資訊、使用安全儲存以及採用安全的資料傳輸和處理方法。建議的做法是從安全的外部儲存或環境變數中載入密碼,並結合現代加密技術來保護資料。
如果您在程式碼漏洞方面需要具體協助,請傳送相關程式碼片段。加密漏洞通常源自於對敏感資料(例如密碼和金鑰)處理不當。一個常見的錯誤是將密碼硬編碼到程式原始碼中,例如:
java:WalletParams faucetWalletParams = WalletParams.builder()
.walletPath("faucet_%s".formatted(this.getClass().getSimpleName()))
.password("faucet") // Уязвимость: пароль прописан в коде
.build();
該方案存在漏洞,因為:
- 透過分析程式碼或日誌,可以輕鬆提取密碼。
- 沒有儲存保護措施(密碼以明文形式儲存在記憶體中)。
- 使用簡單且固定的密碼,這使得攻擊更容易。
其後果可能是安全性完全遭到破壞,包括攻擊者存取錢包或其他受保護的資料。
安全修復
建議永遠不要將金鑰儲存在原始程式碼中,而應該從安全儲存或環境變數中載入。以下是 Java/Spring Boot 中的修復範例:
java:@Bean
@Primary
WalletParams defaultWalletParams(@Value("${wallet.password}") String walletPassword,
@Value("${wallet.path}") String walletPath) {
return WalletParams.builder()
.walletPath(walletPath)
.password(walletPassword)
.build();
}
在配置中 application.properties 或透過外部變數:
文字:wallet.password=${WALLET_PASSWORD}
wallet.path=/home/electrum/.electrum/regtest/wallets/default_wallet
在伺服器端或執行時間環境中:
bash:export WALLET_PASSWORD=ОченьСложныйИУникальныйПароль2025!
java -jar myapp.jar
額外的安全措施
- 使用可靠的金鑰管理員(Vault、AWS Secrets Manager 等)。
- 對密碼套用金鑰衍生函數(PBKDF2、bcrypt、Argon2)。
- 盡量減少記憶體中儲存的密鑰數量。
- 定期輪換密碼。
- 使用存取控制來限制對機密資訊的存取。
因此,這種安全方法避免了在程式碼中以字串形式儲存和傳輸密碼,從而防止密碼輕易洩露並降低攻擊風險。此方法實現了密鑰與程式碼的隔離,並符合現代安全標準。
總之,比特幣應用程式和服務中金鑰管理的關鍵漏洞是加密貨幣生態系統面臨的最嚴重安全威脅之一。將密碼和私鑰直接儲存在原始程式碼中或保護不足的地方,會導致敏感資料外洩給攻擊者。這使得攻擊者有機會完全控制加密錢包、簽署未經授權的交易並竊取用戶資金。
此漏洞屬於 「不安全金鑰 儲存」類別,會導致科學上稱為 「憑證洩漏」 和 「憑證填充」 的攻擊。在比特幣環境中,這些漏洞可能成為大規模私鑰攻擊的入口,破壞網路協定的完整性和機密性,使數百萬個比特幣位址和交易面臨風險。
雖然此類漏洞沒有特定的 CVE 編號,但已有許多相關的漏洞在 CVE 和 OWASP 管理系統下被報告和記錄,尤其是在弱密鑰和身份驗證管理類別中。
現代安全實踐要求立即摒棄硬編碼密碼和密鑰,轉而採用集中式可靠密鑰存儲,實施加密密鑰派生功能,並定期輪換密碼。這是確保抵禦此關鍵漏洞並保障整個比特幣加密貨幣基礎設施安全的唯一方法。
如果不及時消除這些威脅,可能會造成大規模的經濟損失、用戶信心喪失,並減緩去中心化技術的發展。在所有階段都採取負責任的安全措施,是維護比特幣網路在未來數位世界中的穩定性和權威性的唯一途徑。
比特幣的破壞性威脅:簽名產生漏洞及其對加密網路的影響分析
比特幣交易系統基於公鑰密碼學和ECDSA數位簽章演算法,後者負責交易確認和完整性。儘管有強大的保護機制,安全系統仍可能因軟體和硬體漏洞而遭到破壞。在現代實踐中,用於產生比特幣交易簽名的設備中,隨機數產生器(PRNG)熵不足的問題已成為關鍵漏洞。
密碼學漏洞的本質及其對攻擊的影響
比特幣私鑰安全的關鍵在於ECDSA演算法中使用的kkk參數的唯一性和保密性。 kkk的重複使用或可預測性導致的漏洞稱為ECDSA 隨機數重複使用 攻擊 。這種攻擊允許攻擊者利用兩個具有相同kkk的簽章計算出一個私鑰。
實際上,硬體錢包和軟體用戶端都依賴偽隨機數產生器(PRNG)來產生kkk。如果PRNG不夠強或產生的熵不足,攻擊者就可以預測或完全重構kkk,從而自動洩漏私鑰,並允許攻擊者完全控制用戶的資金。
2025年,編號為CVE-2025-27840的嚴重漏洞被揭露,該漏洞涉及廣泛用於硬體錢包(例如Blockstream Jade)的ESP32微控制器。此漏洞與未記錄的命令以及隨機數產生器的弱熵有關,使得攻擊者能夠實施以下攻擊:
- 遠端提取私鑰。
- 偽造交易數位簽名。
- 未經授權代表所有者產生交易。
這使得許多硬體錢包成為攻擊目標,破壞了人們對比特幣生態系統的信任,並加劇了加密資產大規模被盜的威脅。
攻擊的科學名稱
此漏洞屬於以下類型的攻擊:
- ECDSA 隨機數重複使用攻擊
- 也與弱偽隨機數產生器(PRNG)攻擊問題有關
- 硬體實作面向- 側通道攻擊 和 硬體後門利用
這些攻擊統稱為 加密 金鑰復原攻擊。
CVE 和漏洞註冊表
ESP32 微控制器中存在的此類漏洞及其對比特幣簽名的影響已在美國國家標準與技術研究院 (NIST) 資料庫中登記,編號為:
- CVE-2025-27840
這個漏洞描述了攻擊者利用偽隨機數產生器的熵不足和未公開的命令來竊取私鑰和偽造交易的能力。
對比特幣安全的影響
這次攻擊的後果非常嚴重:
- 失去對私鑰的控制權。
- 從硬體和軟體錢包中竊取資金。
- 多台設備遭到入侵和大規模駭客攻擊。
- 破壞用戶信任,降低生態系統安全。
結論和建議
為最大限度降低風險,必須採取以下措施:
- 使用確定性簽章演算法(RFC 6979),消除隨機 kkk 的產生。
- 硬體和軟體更新,以解決 CVE-2025-27840 漏洞。
- 過渡到配備經認證的隨機數產生器的更安全的晶片。
- 定期對錢包安全性進行審核和測試。
- 對使用者進行有關更新和安全必要性的教育工作。
採取這些措施將顯著提高比特幣抵禦此類攻擊的能力,並保護用戶的資金安全。
所展示的明顯存在加密漏洞的程式碼主要展示了基於 Bitcoinj 和 Spring Boot 的 Electrum 和 Regtest 的整合測試,而不是加密實作。
然而,創建新支付地址的這行程式碼可能涉及加密和安全性方面的關鍵問題:
java:Address address1 = electrumClient.createNewAddress(CreateNewAddressParams.builder()
.walletPath(defaultWalletParams.getWalletPath())
.build());
然後 address2 以類似的方式建立第二個位址。
如果出現以下情況,則可能出現漏洞或錯誤:
- 產生的金鑰或位址不是唯一且不可預測的。
- 私鑰使用未加密的儲存(walletPath)。
- Electrum客戶端或Bitcoinj程式庫無法正確處理加密操作。

如果我們專門考慮密碼學漏洞,那麼可能存在以下情況:
有問題的線路可能是:
java:Address address1 = electrumClient.createNewAddress(CreateNewAddressParams.builder()
.walletPath(defaultWalletParams.getWalletPath())
.build());
Address address2 = electrumClient.createNewAddress(CreateNewAddressParams.builder()
.walletPath(defaultWalletParams.getWalletPath())
.build());
如果沒有額外的驗證,例如私鑰保護不力,或者 walletPath 指向不受支援的存儲,地址生成可能不夠安全。
檢查付款發送記錄也很有意義:
java:.flatMap(receivedAmount -> electrumRegtestActions.sendPaymentAndAwaitTx(walletParams, address2, Coin.valueOf(1_000L)))
如果庫不檢查簽名的正確性,或者交易的形成過程中存在錯誤,則可能導致加密漏洞。
由於無法存取內部方法等程式碼 createNewAddress, sendPaymentAndAwaitTx 因此無法確定漏洞的特定位置。您的程式碼更專注於整合和測試,加密功能是在第三方程式庫(例如 Bitcoinj、Electrum 用戶端)中實現的。
更正
以下這篇研究論文詳細介紹了比特幣金鑰和地址產生中的加密漏洞的性質,並提出了一個安全的解決方案,同時提供了一個修復程式碼的範例。
比特幣位址產生中的加密漏洞:原因及安全消除方法
比特幣和其他加密貨幣依賴公鑰密碼學——基於橢圓曲線的ECDSA演算法——來保障交易安全和證明資金所有權。系統的安全性完全取決於私鑰產生的可靠性和密碼庫的使用。然而,儘管該演算法具有很高的安全性,但仍發生過許多因隨機數產生漏洞、使用重複簽名和不當密碼學操作而導致資金被盜的事件。
漏洞成因
比特幣地址產生和交易簽名過程中出現的主要加密漏洞與隨機數產生錯誤或強度不足有關,特別是 ECDSA 中的 kkk 參數,以及在簽署多個訊息時重複使用相同的 kkk 值。

在 ECDSA 中,會選擇一個隨機數 kkk 來對每筆交易進行簽名,該隨機數必須是唯一的且不可預測的:Signature(r,s)=(r=(kG)x mod n,s=k−1(H(m)+rd) mod n)\text{Signature} \quad (rb,s = \quad ( k^{-1} (H(m) + rd) \bmod n \right)Signature(r,s)=(r=(kG)xmodn,s=k−1(H(m)+rd)modn)
其中 ddd 是私鑰,GGG 是生成點,H(m)H(m)H(m) 是訊息雜湊。
如果使用同一個私鑰 ddd 對兩個不同的訊息進行簽名,攻擊者可以根據這兩個簽名計算出 ddd,從而導致私鑰完全洩露,資金被盜。
該漏洞最早由 Nils Schneider 於 2013 年發表的文章中廣泛報導。此外,還有因隨機數產生器漏洞或 JavaScript 及其他庫中的實作錯誤而導致大規模資料外洩的已知案例(例如,2015 年 Blockchain.info 錢包事件)。
其他原因包括:
- 使用弱或已知的偽隨機數產生器。
- 產生金鑰時熵不足。
- 加密庫中的軟體錯誤和漏洞。
威脅的規模
對漏洞範圍的研究表明,數百萬筆交易可能包含重複使用的kkk參數。 2016年,一項對2.1億個位址的分析在比特幣網路中發現了一千多個易受攻擊的位址。這些漏洞意味著,可以使用相同的kkk參數透過兩個簽章來恢復私鑰。
安全解決方案和漏洞修復
為了消除 kkk 參數的重複使用,並提高比特幣和加密貨幣錢包中簽名的安全性,採用了 RFC 6979 標準——ECDSA 確定性簽名。該標準不再隨機選擇 kkk 值,而是根據訊息哈希和私鑰唯一計算得出,從而避免了生成隨機數的需要,並消除了重複或可預測的可能性。
建議使用分層確定性錢包(HD 包、BIP32),其中私鑰提供一條唯一位址鏈,從而最大限度地降低被盜用的風險。
安全修復(Java):
java:import org.bitcoinj.core.ECKey;
import org.bitcoinj.core.Sha256Hash;
import org.bitcoinj.crypto.TransactionSignature;
import org.bitcoinj.script.Script;
import org.spongycastle.crypto.params.ECPrivateKeyParameters;
import org.spongycastle.crypto.signers.HMacDSAKCalculator;
import org.spongycastle.crypto.signers.ECDSASigner;
import org.spongycastle.crypto.digests.SHA256Digest;
import java.math.BigInteger;
public class SafeECDSASigner {
private final ECPrivateKeyParameters privateKey;
public SafeECDSASigner(ECPrivateKeyParameters privateKey) {
this.privateKey = privateKey;
}
/**
* Генерация детерминированной ECDSA подписи согласно RFC 6979
*/
public TransactionSignature sign(Sha256Hash hash) {
ECDSASigner signer = new ECDSASigner(new HMacDSAKCalculator(new SHA256Digest()));
signer.init(true, privateKey);
BigInteger[] components = signer.generateSignature(hash.getBytes());
BigInteger r = components[0];
BigInteger s = components[1];
// Нормализация подписи (low S)
BigInteger HALF_CURVE_ORDER = privateKey.getParameters().getN().shiftRight(1);
if (s.compareTo(HALF_CURVE_ORDER) > 0) {
s = privateKey.getParameters().getN().subtract(s);
}
return new TransactionSignature(r, s, TransactionSignature.SIGHASH_ALL, false);
}
}
此程式碼使用確定性 kkk 產生器 (HMacDSAKCalculator),從而消除隨機數產生誤差。簽章方法為訊息哈希產生安全簽章。
若要在現有交易代碼中使用,必須將隨機簽章產生呼叫替換為確定性方法的呼叫。
安全建議
- 使用支援 RFC 6979 的函式庫和實作。
- 使用 BIP32 HD 錢包進行日常交易。
- 避免使用過時或不安全的加密庫。
- 對密鑰產生和偽隨機數安全性進行審計。
- 確保私鑰儲存安全,防止外洩。
結論
比特幣金鑰和簽名產生過程中的加密漏洞問題至關重要,因為它會導致資金失控。根據 RFC 6979 使用確定性簽名和分層錢包可以顯著降低風險,是現代加密錢包解決方案的最佳實踐。
綜上所述,最終結論可表述如下:
定論
在比特幣簽章協議(基於ECDSA演算法)中發現了一個嚴重的加密漏洞,該漏洞 源自於交易創建過程中 隨機簽章參數kkk的重複使用,或產生了該參數的弱值和可預測值。這個漏洞在科學上被稱為ECDSA隨機數重複使用 攻擊,它允許攻擊者分析使用相同或相關kkk參數產生的多個簽名,並極有可能恢復使用者的私鑰。這會導緻密鑰完全洩漏和資金被盜。
這種攻擊已在實踐中得到證實,包括基於 ESP32 微控制器的硬體錢包遭到入侵的案例。這些硬體錢包由於隨機數產生器的熵不足以及已知的硬體後門而存在漏洞。已登記的漏洞包括 CVE-2025-27840,該漏洞對比特幣錢包所有者和整個生態系統的安全構成嚴重威脅。
此類攻擊的後果極為嚴重:數百萬美元的加密貨幣可能被盜,人們對系統的信任度也會受到嚴重破壞。這種漏洞是加密貨幣歷史上最危險的漏洞之一,因為它利用了密碼學實作中的一個根本缺陷——用於簽署的隨機數產生機制。
為了在實踐中消除這種威脅,建議使用確定性簽章演算法(RFC 6979),該演算法排除了使用隨機數,並根據最新的安全審計更新硬體和加密庫。
了解並及時修復此類漏洞是維護數位資產安全和比特幣網路在全球範圍內穩定的關鍵。