Coldkey – 后量子时代密钥生成和纸质备份工具

2026-05-15 1 阅读 pike00
Coldkey 您的旧加密密钥只要出现一次磁盘故障,就会全部丢失。如果您使用年龄或 sops 来加密秘密,那么丢失您的私钥就意味着永远无法访问它所保护的所有内容。 Coldkey 生成后量子 (ML-KEM-768 + X25519) 年龄密钥,并生成带 QR 码的单页可打印 HTML 备份。打印、层压、存放在防火保险箱中。即使每个数字副本都消失了,您的秘密仍然存在。安装 # Homebrew (macOS/Linux) brew install --cask pike00/tap/coldkey # 或者使用 Go go install github.com/pike00/coldkey/cmd/coldkey@latest 快速启动 Docker (推荐) # 拉取镜像 docker pull ghcr.io/pike00/coldkey:latest # 交互式 — 生成密钥和纸质备份 just docker-run # 备份现有密钥 just docker-backup ~ /.config/sops/age/keys.txt 所有 docker-* 命令都包含安全强化标志(网络隔离、只读文件系统、删除功能)。输出写入 ./output/ 。从源代码 go install github.com/pike00/coldkey/cmd/coldkey@latest Coldkeygenerate -o ~ /.config/sops/age/keys.txt 命令 Coldkey(无参数) — 交互模式 提供一个菜单以生成新密钥或从现有密钥创建备份。提示输入文件路径并在覆盖之前确认。 Coldkey generated 生成新的后量子时代密钥对。 Coldkeygenerate[flags] -o PATH 密钥文件输出路径(默认:stdout) -f 覆盖现有文件 --no-backup 跳过 HTML 备份生成 Coldkeyback 从现有密钥文件创建可打印的 HTML 纸质备份。 Coldkey backup [flags] KEYFILE -o PATH HTML 输出路径(默认:KEYFILE-backup.html) Coldkey version 打印版本字符串。安全模型层测量内存 mlockall(MCL_CURRENT|MCL_FUTURE) 防止密钥材料被交换到磁盘文件以模式 0600 写入,fsynced;临时文件粉碎(3遍覆盖) 进程机密仅通过标准输入/文件传递,从不在进程参数中传递 Container --network none --read-only --cap-drop ALL --security-opt no-new-privileges:true Image distroless/static:nonroot — 无 shell,非 root UID 65534 内存清零 在 GC 之前在关键缓冲区上尽最大努力 secure.Zero() (请参阅限制) Docker 标志解释docker-run 和 docker-backup 命令自动应用这些标志: 标志 目的 --network none 无网络访问 — 密钥生成纯本地 --read-only 不可变根文件系统 --cap-drop ALL 删除所有 Linux 功能 --security-opt no-new-privileges:true 防止权限升级 --tmpfs /tmp:rw,noexec,nosuid,size=10m RAM 支持的临时目录 --cap-add IPC_LOCK (可选)启用 mlockall对于交换保护 QR 码编码 PQ Age 仅存储 32 字节种子(不是扩展的 ML-KEM-768 私钥),因此完整的 keys.txt 通常约为 2,089 字节 - 适合单个 QR 码(版本 40,EC-L 支持 2,953 字节)。如果密钥文件超出单个 QR 容量,coldkey 会使用简单的成帧协议自动将其拆分为多个 QR 码:COLDKEY:/: 恢复:按顺序扫描所有 QR 码,去除每个 QR 码的 COLDKEY:N/M: 前缀,连接并验证 SHA-256 校验和。纸质备份内容 生成的 HTML 文档包含: 标题和元数据(日期、主机名、用户、源路径) 等宽原始密钥文本(用于手动转录) 带容量注释的 QR 码 用于验证的 SHA-256 校验和 分步恢复说明 打印按钮(隐藏在打印介质中) 恢复程序 扫描 QR 码(或键入原始密钥文本) 保存到 ~/.config/sops/age/keys.txt 验证:sha256sum keys.txt 与打印的校验和匹配测试: sops -d Building just build # 本地二进制文件 just docker # Docker 镜像 (ghcr.io/pike00/coldkey) just test # 运行测试 just ci # 完整 CI: vet → test → build → docker 限制 Go GC 和安全内存:Go 的垃圾收集器可能会复制内存中的对象,并且 Go 字符串是不可变的,这意味着作为字符串保存的密钥材料(例如来自 Identity.String() )不能可靠被覆盖。 secure.Zero() 使用 Go 的内置 clear() 来擦除 []byte 缓冲区,但早期的字符串副本可能会保留在堆中,直到垃圾收集为止。 mlockall 阻止其中任何内容被交换到磁盘;这些共同提供了深度防御,而不是立即从 RAM 中删除密钥材料的加密保证。 mlockall 需要 CAP_IPC_LOCK :将 --cap-add IPC_LOCK 添加到 Docker 运行以实现完全交换保护。如果没有它,coldkey 会向 stderr 打印警告并继续。 QR 扫描:非常密集的 QR 码(版本 40)可能很难从纸上扫描。原始关键文本始终作为手动后备包含在内。许可麻省理工学院