安全模型
BitTool Signer 是一款适用于 iPhone 和 Android 的离线软件签名器。它在设备上派生密钥并完成签名,与外界的唯一联系方式是二维码。本节说明它是如何做到这些的,以及它的保护在哪里止步,便于你向用户准确地介绍它。
两款 App 运行同一个 JavaScript 签名引擎,因此请求在两者上的解码、匹配和签名方式完全相同。不同之处在于它们依赖操作系统的部分:iOS 钥匙串或 Android Keystore,JavaScriptCore 或 QuickJS。这些页面以 iPhone 版为准进行说明,并注明 Android 版的不同之处。
一段话概括设计
私钥只存在于 BitTool Signer 内部的内存中,而且仅在生成签名的那一刻存在。存储时,每个钱包的助记词会被加密两次:一次使用由钱包密码派生的密钥,另一次使用永不离开手机的设备密钥(保存在 iOS 钥匙串中,或在 Android Keystore 内部生成)。App 不含任何联网代码。请求以二维码形式传入,由内置的 JavaScript 引擎在隔离的运行时中解码和检查(iPhone 上是 JavaScriptCore,Android 上是 QuickJS),而每一次签名都需要再次输入钱包密码。
防护范围
| 威胁 | 防护措施 |
|---|---|
| 在线手机或电脑上的恶意软件,或被盗用的账户 | 密钥位于另一台离线设备上。在线钱包始终只持有公钥。 |
| 被篡改的请求(错误的收款方、金额、网络、签名者) | 签名器会解码并展示它要签名的确切字节;签名前会检查签名者密钥、网络和结构。参见签名前的检查。 |
| 签名手机被盗 | 保险库(vault)需要钱包密码和设备密钥,而操作系统只有在手机设置了锁屏密码或屏幕锁定时才会提供设备密钥。密码猜测会被放慢。 |
| App 文件被复制 | 保险库经过加密,并绑定到一个永不离开手机、且不包含在备份中的设备密钥。 |
| 随机数生成器强度不足 | 新的助记词使用操作系统的密码学安全随机数生成器,引擎中的 crypto.getRandomValues 和 Math.random 也都改接到它上面。参见种子生成。 |
不做的承诺
这些局限写在 App 自己的文档中,集成方同样不应夸大:
- 它不是硬件钱包。签名在 App 的内存中进行,由操作系统保护,而不是在安全芯片内部完成。越狱、root 或以其他方式被攻破的操作系统,可以在机密使用期间观察到它们。
- 它不会让手机变成物理隔离(air-gapped)设备。请让签名手机保持飞行模式,关闭无线局域网和蓝牙,并且不要在上面安装其他 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 |
| 二维码协议 | 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/。