#offline #bitcoin #sign #cold

firma

Firma是一个库,用于创建在离线设备上存储私钥的比特币多签名钱包

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

MIT 许可证

205KB
4.5K SLoC

MIT license Crates

Firma

警告 - 早期软件,请勿与真实比特币一起使用。

Firma是一个工具,用于创建在离线设备上存储私钥的比特币多签名钱包。

离线设备可以是CLI 终端或一部备用的Android 手机。

设备之间通过QR码传输信息。由于PSBT可能变得很大(一些KB),可能需要多个QR码,这些QR码通过QR 结构化附加 链接

钱包数据保存在本地文件系统中(见 datadir),并且可选地使用外部提供的密钥加密(在Android中,所有内容默认使用由本地keystore保护的密钥加密)。

它基于

高级流程

                                      +---------------------+
+---------------------+               |+---------------------+
|                     |     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返回到可以组合和最终化这些交易的节点(此操作可以并行或顺序进行)。

需求

您需要

从crates安装

cargo install firma-cli

从源安装

git clone https://github.com/RCasatta/firma/
cd firma/cli
cargo build --release

可执行文件为 target/release/firma-onlinetarget/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