#私钥 #二维码 #OpenPGP #PDF文件 #备份 #密钥文件 #代码

应用 openpgp-paper-backup

生成和恢复OpenPGP密钥的纸质打印备份

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图像

Download history 9/week @ 2024-03-26 29/week @ 2024-04-02 2/week @ 2024-05-21

每月247次下载

自定义许可证LGPL-2.1

470KB
1K SLoC

openpgp-paper-backup

openpgp-paper-backup 是一个用于OpenPGP密钥的物理打印在纸上的备份的命令行工具。如果您使用例如 GnuPG,您应该妥善备份您的私钥。理想情况下,备份应该是离线的。您还应考虑备份密钥的冗余。例如,如果您决定将备份存储在U盘上,您必须考虑到该驱动器可能会因长时间未拔出而遭受比特腐化。依赖于时不时地记得插入它并不是理想的做法。

使用 openpgp-paper-backup,您将能够生成包含多个 二维码 的PDF,每个二维码都包含私钥的一部分。以后,如果需要,您可以使用 openpgp-paper-backup 从扫描的PDF中恢复私钥。工作流程如下:

  1. 使用 openpgp-paper-backup backup 将OpenPGP私钥转换为PDF
  2. 扫描PDF并安全存储打印输出。
  3. 如果您丢失私钥并需要依赖备份,您需要将打印输出的每一页扫描成JPEG文件。将所有JPEG文件存储在单个目录中。
  4. 使用 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位的长度,这对于大多数硬件密钥来说应该是一个相当安全的选择。

asciicast

导出密钥

现在,是时候将密钥(主证书密钥和三个子密钥)导出到一个文件中。当准备可打印的PDF时,该文件将被openpgp-paper-backup读取。

同样,最重要的理解是,我们必须导出私钥。使用GnuPG,你可以通过--export-secret-keys来完成这个操作。如果你使用--export-keys,那么你只会备份密钥的公开部分。

确保在导出私钥时使用--export-secret-keys.

按照上面的示例

asciicast

生成纸质备份

现在,我们已经将私钥保存到文件中:exported_PRIVATE_keys.pgp。我们准备好生成可打印的PDF文档。

asciicast

结果,我们得到了一些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>导入它。

asciicast

依赖关系

~60MB
~773K SLoC