8个版本 (破坏性)
0.20.0 | 2021年8月6日 |
---|---|
0.19.0 | 2020年12月23日 |
0.18.0 | 2020年12月15日 |
0.17.0 | 2020年12月3日 |
0.13.0 | 2020年10月14日 |
#5 in #cold
每月下载量 29次
用于 firma-cli
205KB
4.5K SLoC
Firma
警告 - 早期软件,请勿与真实比特币一起使用。
Firma是一个工具,用于创建在离线设备上存储私钥的比特币多签名钱包。
离线设备可以是CLI 终端或一部备用的Android 手机。
设备之间通过QR码传输信息。由于PSBT可能变得很大(一些KB),可能需要多个QR码,这些QR码通过QR 结构化附加 链接
钱包数据保存在本地文件系统中(见 datadir),并且可选地使用外部提供的密钥加密(在Android中,所有内容默认使用由本地keystore保护的密钥加密)。
它基于
- bitcoin core
- PSBT(部分签名比特币交易)
- rust-bitcoin
- 和其他 库
高级流程
+---------------------+
+---------------------+ |+---------------------+
| | xpubs || |
| online machine | <------------ || offline machines |
| | || |
| * firma-online | PSBT || * firma-offline |
| * bitcoin node | ------------> || * xprv |
| * xpubs | <------------ || |
| | +| |
+---------------------+ +---------------------+
设置
- 在一个或多个离线设备上创建一个或多个扩展私钥
xprv
。 - 将相应的扩展公钥
xpub
组合在一起,并将这些导入到在线Bitcoin core节点中,以仅监视模式。 - 将带有
xpub
的钱包描述符带回离线机器。虽然这不是签名的严格必要条件,但离线机器上的钱包充当备份和附加信息(例如,检查更改是否属于钱包)。
使用
接收
firma-online
工具可以创建接收比特币的地址。
支出
- 从
firma-online
工具创建交易,并将其导出为PSBT格式。 - 将PSBT带到离线设备上,检查交易,如果一切看起来正确,则使用设备上现有的私钥签署PSBT。
- 将所有PSBT返回到可以组合和最终化这些交易的节点(此操作可以并行或顺序进行)。
需求
您需要
- Bitcoin core 0.20.1
- rust (MSRV >= 1.56.0)。
从crates安装
cargo install firma-cli
从源安装
git clone https://github.com/RCasatta/firma/
cd firma/cli
cargo build --release
可执行文件为 target/release/firma-online
和 target/release/firma-offline
测试
集成测试需要一个环境变量指向bitcoin core的可执行文件(bitcoind
)。
例如
BITCOIND_EXE=./bitcoin-0.20.1/bin/bitcoind cargo test
示例
查看bin readme 中的CLI示例
常见问题解答
Firma如何处理segwit输入上的费用错误?
完整的前一个交易包含在PSBT中,以检查prevout哈希与之前交易匹配,如果攻击需要更改金额,则会导致错误。
Firma如何处理生成接收地址的在线钱包的攻击?
离线应用程序也可以生成地址。接收过程应考虑到在线和离线设备,检查生成的接收地址是否匹配。
此外,离线设备支持钱包签名。此签名可以导入到在线设备中并验证,以确保只读钱包未遭到篡改。
Firma离线如何知道更改地址是我的?
Firma在线存储钱包的完整只读描述符,因此可以根据PSBT中存在的推导生成地址,如果地址匹配,则属于钱包。
Firma如何应对对设备的物理攻击?
可以可选地对磁盘上持久化的任何内容进行加密。
在cli中,用户可以使用现有的gpg基础设施
# encryption key creation and storage in encrypted gpg
dd if=/dev/urandom bs=1 count=32 | gpg --encrypt >encryption_key.gpg
# bitcoin private key creation
gpg --decrypt encryption_key.gpg | firma-offline --read-stdin random --key-name bitcoin-key
在Android上,系统密钥库用于加密32个随机字节,因此如果设备有一个安全元素,物理攻击需要破坏该安全元素。
为什么我需要在离线设备中钱包描述符?
虽然钱包描述符在离线签名者中不是必需的,但它允许进行一些安全检查,如地址检查。最重要的是,描述符作为备份的一部分是绝对必要的,例如在3of5方案中,3个主私钥不足以签名交易,因为我们需要5个主公钥。因此,流程要求每个离线设备存储包含所有主公钥的钱包描述符。
即使在使用`encryption_key`的情况下,我仍然在日志中看到了机密数据,你们在做什么?
在发布构建中禁用了日志输出,但如果你使用的是调试构建,你可能会在日志中看到机密数据。一直追求积极删除敏感数据,然而,它始终可以打印用于与必须包含此机密数据的库通信的json,因此采取了在发布构建中禁用日志的方法。
赞助商
由 Squarecrypto 赞助的项目
捐赠
我是OpenTimestamps日历的维护者之一,如果你觉得可以,你可以在那里捐赠
依赖项
~17–28MB
~353K SLoC