Coldkey – 后量子 age 密钥生成与纸质备份工具

Hacker News Top 工具

摘要

Coldkey 是一个命令行工具,用于生成后量子 age 加密密钥,并创建带有 QR 码的可打印 HTML 备份,以实现安全的离线存储。

暂无内容
查看原文
查看缓存全文

缓存时间: 2026/05/15 06:29

pike00/coldkey

来源:https://github.com/pike00/coldkey

coldkey

CI(https://github.com/pike00/coldkey/actions/workflows/ci.yml) | 发布版(https://github.com/pike00/coldkey/releases/latest) | Go(https://go.dev/) | 许可证:MIT

你的年龄加密密钥与磁盘故障之间仅一步之遥——一旦丢失,便永久无法恢复。

如果你使用 age(https://age-encryption.org/)或 sops(https://github.com/getsops/sops)加密机密,丢失私钥意味着永久失去对其保护的所有内容的访问权限。coldkey 生成后量子(ML-KEM-768 + X25519)(https://words.filippo.io/post-quantum-age/)age 密钥,并生成包含二维码的单页可打印 HTML 备份。打印、覆膜、存放在防火保险箱中。即使所有数字副本消失,你的机密依然存续。

演示(https://asciinema.org/a/MitZvLXcwYdBXkeF)

打印输出图片

安装

# 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

所有 just docker-* 命令都包含安全加固标志(网络隔离、只读文件系统、去掉 capabilities)。输出写入 ./output/

从源码运行

go install github.com/pike00/coldkey/cmd/coldkey@latest
coldkey generate -o ~/.config/sops/age/keys.txt

命令

coldkey(无参数)——交互模式

提供菜单,用于生成新密钥或从现有密钥创建备份。提示文件路径,并在覆盖前确认。

coldkey generate

生成新后量子 age 密钥对。

coldkey generate [flags]
  -o PATH    密钥文件输出路径(默认:stdout)
  -f         覆盖现有文件
  --no-backup    跳过 HTML 备份生成

coldkey backup

从现有密钥文件创建可打印的 HTML 纸质备份。

coldkey backup [flags] KEYFILE
  -o PATH    HTML 输出路径(默认:KEYFILE-backup.html)

coldkey version

打印版本字符串。

安全模型

措施
内存`mlockall(MCL_CURRENT
文件以模式 0600 写入,fsynced;临时文件被粉碎(3 次覆写)
进程机密仅通过 stdin/文件传递,绝不通过进程参数
容器--network none --read-only --cap-drop ALL --security-opt no-new-privileges:true
镜像distroless/static:nonroot — 无 shell,非 root UID 65534
内存归零在 GC 前对密钥缓冲区尽力执行 secure.Zero()(参见限制

Docker 标志说明

just docker-runjust docker-backup 命令自动应用以下标志:

标志用途
--network none无网络访问——密钥生成纯本地
--read-only不可变根文件系统
--cap-drop ALL去掉所有 Linux capabilities
--security-opt no-new-privileges:true防止权限提升
--tmpfs /tmp:rw,noexec,nosuid,size=10m内存支持的临时目录
--cap-add IPC_LOCK(可选)启用 mlockall 以保护交换

二维码编码

PQ age 仅存储 32 字节种子(而非展开后的 ML-KEM-768 私钥),因此完整的 keys.txt 通常约为 2,089 字节——可放入单个二维码(版本 40,EC-L 支持 2,953 字节)。如果密钥文件超出单二维码容量,coldkey 使用简单的帧协议自动将其分割到多个二维码中:

COLDKEY:<序号>/<总数>:<数据>

恢复:按顺序扫描所有二维码,去掉每个的 COLDKEY:N/M: 前缀,拼接,验证 SHA-256 校验和。

纸质备份内容

生成的 HTML 文档包含:

  • 标题和元数据(日期、主机名、用户、源路径)
  • 原始密钥文本(等宽字体,用于手动抄录)
  • 二维码,附带容量标注
  • SHA-256 校验和,用于验证
  • 分步恢复说明
  • 打印按钮(打印媒体中隐藏)

恢复步骤

  1. 扫描二维码(或手动输入原始密钥文本)
  2. 保存到 ~/.config/sops/age/keys.txt
  3. 验证:sha256sum keys.txt 与打印的校验和一致
  4. 测试:sops -d <加密文件>

构建

just build        # 本地二进制
just docker       # Docker 镜像(ghcr.io/pike00/coldkey)
just test         # 运行测试
just ci           # 完整 CI:vet → test → build → docker

限制

  • Go GC 和安全内存:Go 的垃圾收集器可能会在内存中复制对象,且 Go 字符串是不可变的,因此以 string(例如来自 identity.String())形式持有的密钥材料无法可靠地覆写。secure.Zero() 使用 Go 的内置 clear() 擦除 []byte 缓冲区,但早期的字符串副本可能会在堆中一直存在直到垃圾收集。mlockall 可防止这些内容被交换到磁盘;两者共同提供了纵深防御,但并不能保证密钥材料立即从 RAM 中擦除的加密保证。
  • mlockall 需要 CAP_IPC_LOCK:在 Docker 运行时添加 --cap-add IPC_LOCK 以获得完整的交换保护。没有此标志时,coldkey 会向 stderr 打印一条警告并继续运行。
  • 二维码扫描:非常密集的二维码(版本 40)可能难以从纸上扫描。原始密钥文本始终作为手动备用方案包含在内。

许可证

MIT

相似文章

重新审视后量子WireGuard

Lobsters Hottest

本文介绍了一篇密码学研究论文,重新审视后量子WireGuard,探讨如何保护WireGuard VPN协议免受未来量子计算威胁。

二维码生成器

Simon Willison's Blog

一款可自定义样式的二维码生成工具,借助Claude构建。支持网址、文本和WiFi网络码。

使用 Passkey 解锁加密的 ZFS 卷

Lobsters Hottest

本文介绍了 Revaulter v2,这是一个允许在启动时使用 Passkey(WebAuthn)解锁加密 ZFS 卷的工具。它支持通过移动端 Web 界面进行远程审批,且无需以明文形式存储密钥。

Microsoft BitLocker – YellowKey零日漏洞利用

Hacker News Top

一名安全研究人员发布了名为YellowKey的零日漏洞利用,可绕过Windows 11和Windows Server 2022/2025上的Microsoft BitLocker加密,通过USB闪存驱动器即可完全访问锁定驱动器;该漏洞似乎以后门的方式运作,使用后相关文件会消失。