5个版本
0.2.3 | 2024年3月12日 |
---|---|
0.2.2 | 2024年3月9日 |
0.2.1 | 2024年3月8日 |
0.2.0 | 2024年3月8日 |
0.1.0 | 2024年2月24日 |
#136 在 图像
每月247次下载
470KB
1K SLoC
openpgp-paper-backup
openpgp-paper-backup
是一个用于OpenPGP密钥的物理打印在纸上的备份的命令行工具。如果您使用例如 GnuPG,您应该妥善备份您的私钥。理想情况下,备份应该是离线的。您还应考虑备份密钥的冗余。例如,如果您决定将备份存储在U盘上,您必须考虑到该驱动器可能会因长时间未拔出而遭受比特腐化。依赖于时不时地记得插入它并不是理想的做法。
使用 openpgp-paper-backup
,您将能够生成包含多个 二维码 的PDF,每个二维码都包含私钥的一部分。以后,如果需要,您可以使用 openpgp-paper-backup
从扫描的PDF中恢复私钥。工作流程如下:
- 使用
openpgp-paper-backup backup
将OpenPGP私钥转换为PDF - 扫描PDF并安全存储打印输出。
- 如果您丢失私钥并需要依赖备份,您需要将打印输出的每一页扫描成JPEG文件。将所有JPEG文件存储在单个目录中。
- 使用
openpgp-paper-backup restore
恢复备份。
它与 paperkey 有何不同?
paperkey
是一款优秀且健壮的软件。它完全满足我的需求,前提是我有一个可靠的OCR系统,可以将扫描文档(paperkey的输出)转换回文本文件。我玩了很多关于Tesseract,但结果不可预测。这种OCR在识别实际人类语言(仅测试了英语)方面做得很好,但面对一串十六进制数,表现糟糕。它根本就不是为那个目的设计的。这就是我选择创建不同解决方案的原因。具体来说,我并没有生成文本,而是创建了一个工具,它创建了一系列二维码。每个二维码都包含PEM格式密钥的一部分。该工具能够轻松地从二维码中重建完整的私钥。
实际应用场景
OpenPGP 由于各种不同的原因被广泛使用。有很多应用场景。不可能全部涵盖。无论您的特定应用场景是什么,您可能仍然希望安全地备份您的私钥。无论如何,让我在这里详细说明我的应用场景。
我是一名 Debian 开发者。我的密钥的安全性非常重要——任何可以访问Debian开发者OpenPGP密钥的人都可以上传软件包到Debian存档。此外,如果私钥丢失或损坏,在没有访问旧密钥的情况下更换密钥的过程非常繁琐。
因此,我使用密钥的方式是
- 我的主要证书OpenPGP密钥离线备份(离线备份)。它从未出现在我的开发工作站上。
- 我为主证书密钥附加了3个子密钥
- 签名密钥 我使用此密钥来签署我的电子邮件和Debian软件包上传
- 认证密钥 我使用它与SSH登录到我的各种系统
- 加密密钥 仅在收到加密电子邮件时使用
- 我已经将上述密钥传输到硬件密钥中,所以这些也都没有出现在我的开发工作站上。当我需要使用它们时,我必须将密钥插入USB端口,并在提示时输入PIN码。密钥永远不会被传输回电脑——所有加密操作都由密钥本身执行。
硬件密钥中最受欢迎的是Yubikey。它们非常可靠,几乎是行业标准。所以它们应该可以满足您的需求。如果可能的话,我更喜欢更开源和开放的硬件解决方案,所以我的硬件密钥选择是Nitrokey。
我主要通过GnuPG使用我的OpenPGP密钥,因为所有Debian开发者的工具都是基于它的。
创建OpenPGP证书密钥
由于您以后不会将证书密钥存储在您的家目录中,因此最好在临时目录中创建密钥,在创建和备份主(证书)密钥以及所有3个子密钥之后将其删除。因此,最好设置GNUPGHOME
环境变量——默认情况下,GnuPG将配置、密钥和信任网细节存储在~/.gnupg
目录中。然后,使用gpg --expert --full-gen-key
来生成
Curve 25519
证书密钥RSA
子密钥用于签名RSA
子密钥用于认证RSA
子密钥用于加密
如果你的硬件密钥支持椭圆曲线密钥,你可能需要使用Curge 25519
来创建所有子密钥。虽然RSA是一个相当安全的选择,尤其是当你打算尝试不同品牌时——据我所知,大多数,如果不是全部,都支持至少2048位长度的RSA密钥。在这里,我将使用3072
位的长度,这对于大多数硬件密钥来说应该是一个相当安全的选择。
导出密钥
现在,是时候将密钥(主证书密钥和三个子密钥)导出到一个文件中。当准备可打印的PDF时,该文件将被openpgp-paper-backup
读取。
同样,最重要的理解是,我们必须导出私钥。使用GnuPG,你可以通过--export-secret-keys
来完成这个操作。如果你使用--export-keys
,那么你只会备份密钥的公开部分。
确保在导出私钥时使用--export-secret-keys
!.
按照上面的示例
生成纸质备份
现在,我们已经将私钥保存到文件中:exported_PRIVATE_keys.pgp
。我们准备好生成可打印的PDF文档。
结果,我们得到了一些JPEG文件和一个PDF文档。
S ls my-demo-key-backup-dir/
my-demo-key-backup_00.jpeg my-demo-key-backup_03.jpeg my-demo-key-backup_06.jpeg my-demo-key-backup_09.jpeg my-demo-key-backup_12.jpeg
my-demo-key-backup_01.jpeg my-demo-key-backup_04.jpeg my-demo-key-backup_07.jpeg my-demo-key-backup_10.jpeg my-demo-key-backup.pdf
my-demo-key-backup_02.jpeg my-demo-key-backup_05.jpeg my-demo-key-backup_08.jpeg my-demo-key-backup_11.jpeg
每个JPEG文件都包含exported_PRIVATE_keys.pgp
文件的一部分,以二维码的形式。PDF包含所有这些二维码。你可以
- 打印所有二维码,或者
- 简单地打印PDF文件(在这里,
my-demo-key-backup-dir/my-demo-key-backup.pdf
)。
为了这次演示,我将假设你已经打印了PDF文档。
从扫描的备份中恢复
现在,要恢复备份,你必须将PDF扫描成一系列JPEG(每个JPEG是PDF的一页),或者将所有二维码打印成一系列JPEG。将所有扫描的JPEG文件放入一个目录中(该目录不能包含任何其他文件!只有JPEG文件)。然后运行openpgp-paper-backup restore ...
命令来将文件恢复为OpenPGP密钥文件。一旦恢复,你可以使用gpg --import <the_file_youve_restored>
导入它。
依赖关系
~60MB
~773K SLoC