跳至主要内容

安全模型

BitTool Signer 是一款適用於 iPhone 與 Android 的離線軟體簽名器。它在裝置上衍生金鑰並完成簽名,與外界的唯一聯繫方式是 QR 碼。本節說明它如何做到這些,以及它的保護在哪裡止步,方便你向使用者準確介紹它。

兩款 App,一個引擎

兩款 App 執行同一個 JavaScript 簽名引擎,因此請求在兩者上的解碼、比對與簽名方式完全相同。不同之處在於它們仰賴作業系統的部分:iOS 鑰匙圈或 Android Keystore,JavaScriptCore 或 QuickJS。這些頁面以 iPhone 版為準說明,並註明 Android 版的不同之處。

一段話說明設計​

私鑰只存在於 BitTool Signer 內部的記憶體中,而且僅在產生簽名的那一刻存在。儲存時,每個錢包的助記詞會被加密兩次:一次使用由錢包密碼衍生的金鑰,另一次使用永不離開手機的裝置金鑰(保存在 iOS 鑰匙圈中,或在 Android Keystore 內部產生)。App 不含任何連網程式碼。請求以 QR 碼形式傳入,由內建的 JavaScript 引擎在隔離的執行環境中解碼與檢查(iPhone 上是 JavaScriptCore,Android 上是 QuickJS),而每一次簽名都需要再次輸入錢包密碼。

防護的威脅​

威脅防護方式
連網手機或電腦上的惡意軟體或遭入侵的帳戶金鑰位於另一台離線裝置上。連網錢包始終只持有公鑰。
遭竄改的請求(錯誤的收款人、金額、網路、簽名者)簽名器會解碼並顯示它要簽署的確切位元組;在簽名之前,它會檢查簽名者金鑰、網路與結構。請參閱簽名前的檢查。
簽名手機遭竊保險庫(vault)需要錢包密碼與裝置金鑰,而作業系統只有在手機設定了裝置密碼或螢幕鎖定時才會提供裝置金鑰。密碼猜測會被放慢。
App 檔案遭複製保險庫經過加密,並綁定到一把永不離開手機、且不納入備份的裝置金鑰。
隨機數產生器強度不足新的助記詞使用作業系統的密碼學安全隨機數產生器,引擎中的 crypto.getRandomValues 與 Math.random 也都改接到它上面。請參閱種子產生。

不宣稱的事項​

這些限制都寫在 App 本身的說明文件中,整合時也不應誇大:

  • 它不是硬體錢包。 簽名在 App 的記憶體中進行,由作業系統保護,而不是在安全晶片內部完成。越獄、root 或以其他方式遭入侵的作業系統,可以在機密使用期間觀察到它們。
  • 它不會讓手機變成實體隔離(air-gapped)裝置。 請讓簽名手機保持飛航模式,關閉 Wi-Fi 與藍牙,並且不要在上面安裝其他 App。App 會顯示這些建議,但無法強制執行。
  • 離線審核有其限制。 簽名器無法得知目前的餘額、代幣的實際行為、合約是否惡意、blockhash 是否仍有效,或鏈上的多重簽名成員。它會顯示位元組所表達的內容,並標示它無法驗證的部分。
  • 尚未經過獨立稽核。 兩款 App 都已開源,並各自接受過兩次 AI 輔助的安全審查。沒有一次發現嚴重或高風險問題,但 Android 版的審查發現了仍未解決的中風險問題,其中三項位於共用引擎中;兩款 App 都尚未經過獨立資安公司的稽核。

安全審查​

1.0.0 版在發布前於每個平台各接受了兩次審查,全部為 AI 輔助審查。iPhone 版的審查(Opus 5 與 GPT-6 Astra)各發現一項低風險問題,並都從原始碼逐位元組重建了隨附發布的引擎。Android 版的審查(Opus 5.5 與 GPT-6 Astra)發現了中風險問題:可能低估請求內容的 Solana 與 Bitcoin 摘要,以及發布簽署金鑰的保管方式。報告均已全文公開,並附有每項發現事項及其狀態:安全審查。

程式碼位置​

領域原始碼
隨機性、保險庫加密、鑰匙圈BitToolSigner/Core/VaultCrypto.swift、WalletVault.swift
BIP39 種子衍生BitToolSigner/Core/BIP39Seed.swift
JavaScriptCore 沙箱BitToolSigner/Core/SigningEngine.swift
QR 協定engine/protocols.js
將請求對應到錢包engine/src/resolver.js
各鏈的解析與簽名engine/src/{bitcoin,evm,tron,solana}.js

程式碼儲存庫:iPhone 版 github.com/bitbill/bittool-signer-ios,Android 版 github.com/bitbill/bittool-signer-android。Android App 包含同樣的 engine/ 資料夾;其 Kotlin 程式碼位於 app/、core/ 與 feature/,QuickJS 宿主位於 core/engine/src/main/cpp/。