PaperAge
使用Age格式(age-encryption.org/v1)轻松安全地备份(小型)机密信息到纸质文档。
特性
- 接受来自文件或标准输入的输入
- 使用密码对输入进行加密
- 输出包含加密密文二维码的PDF文件
- 支持A4和信纸尺寸
- 优化二维码的纠错级别(较少数据→更高纠错能力)
- 密码不会显示在PDF上,因此可以在不受信任的打印机上打印(例如在工作场所或图书馆)
- 恢复备份时无需使用PaperAge:使用任何二维码扫描器和任何Age实现即可。
局限性
- 由于二维码无法编码任意大小的有效载荷,最大输入大小约为1.9 KiB
- 目前仅支持基于密码的加密
威胁模型和使用场景
- 主要用于保存机密信息,如双因素认证恢复码
- 手动添加密码允许使用公共打印机,例如图书馆、办公室、复印店等
- 为了额外保护,可以记住密码或将其与打印件分开存储
- 即使密码就在旁边,扫描和解密的需求也能防止简单的对手(普通窃贼不会关心你的Mastodon账户)
- 如果需要防范国家级或其他高级威胁,请寻找其他解决方案
示例
这是输出PDF的样子(或者查看信纸版本)。二维码可以轻松使用iPhone(或任何现代智能手机)读取。
如果你想自己尝试解码,密码是snakeoil
。
安装
发布版本可用于macOS(Apple Silicon和Intel)、Linux(ARM和x86-64)和Windows(x86-64)。
虽然Windows版本应该可以在Windows 10和11上运行,但只有Windows 11是"官方"支持的。
Homebrew
添加PaperAge Tap以使用Homebrew安装最新版本:
brew tap matiaskorhonen/paper-age
brew install paper-age
二进制文件
从Releases页面下载最新版本,解压文件,并将paper-age
二进制文件安装到PATH
中的某个位置(例如/usr/local/bin
)。
# 下载最新版本(选择你的操作系统)
# macOS(Intel或Apple Silicon):
curl -Lo paper-age.tar.gz https://github.com/matiaskorhonen/paper-age/releases/download/v1.3.3/paper-age-universal-apple-darwin.tar.gz
# Linux(x86-64):
curl -Lo paper-age.tar.gz https://github.com/matiaskorhonen/paper-age/releases/download/v1.3.3/paper-age-x86_64-unknown-linux-gnu.tar.gz
# Linux(ARM):
curl -Lo paper-age.tar.gz https://github.com/matiaskorhonen/paper-age/releases/download/v1.3.3/paper-age-aarch64-unknown-linux-gnu.tar.gz
# 使用GitHub CLI工具验证工件证明(可选)
gh attestation verify paper-age.tar.gz --repo matiaskorhonen/paper-age
# 解压文件
tar -xf paper-age.tar.gz
# 将二进制文件安装到/usr/local/bin
sudo install paper-age /usr/local/bin/
# 或者:sudo mv paper-age /usr/local/bin/
Cargo
如果您已经安装了 Rust,可以使用 Cargo 安装 PaperAge:
cargo install paper-age
构件认证
从 v1.3.1 版本开始,PaperAge 发布版本具有构件认证。认证是使用 GitHub 的工具生成的。
使用方法
paper-age [选项] [输入]
参数
<输入>
— 要读取的文件路径。默认为标准输入。最大约 1.9KB。
选项
-
-t
,--title <标题>
— 页面标题(最多 64 个字符)默认值:
PaperAge
-
-n
,--notes-label <备注标签>
— 二维码下方的备注标签(最多 32 个字符)默认值:
密码:
-
--skip-notes-line
— 跳过备注占位行(例如 密码:________) -
-o
,--output <输出>
— 输出文件名。使用 - 表示标准输出。默认值:
out.pdf
-
-s
,--page-size <页面大小>
— 纸张大小 [默认:a4
] [可选值:a4
,letter
] -
-f
,--force
— 如果输出文件已存在,则覆盖 -
-g
,--grid
— 绘制网格样式以调试布局问题 -
--fonts-license
— 打印嵌入字体的许可证 -
-v
,--verbose...
— 每次出现增加输出详细程度 -
-q
,--quiet...
— 每次出现减少输出详细程度 -
-h
,--help
— 打印帮助信息 -
-V
,--version
— 打印版本信息
备注/密码字段
二维码下方的备注字段可以通过 --notes-label <文本>
和 --skip-notes-line
参数自定义。标签长度没有强制限制,但最终文本会超出页面边界。
示例
-
打印提示占位符而不是密码:
paper-age --notes-label="提示:"
-
打印时间戳而不是备注字段:
paper-age --notes-label="创建时间:$(date -Iseconds)" --skip-notes-line
压缩
PaperAge 完全不关心输入文件的类型。如果需要压缩更多数据,可以在将文件传递给 PaperAge 之前对其进行压缩,例如:
gzip --best --stdout in.txt | paper-age --output=compressed.pdf --title="in.txt.gz"
压缩比因输入数据而异,是否值得这样做取决于您。
扫描二维码
在 iOS 上,最好使用控制中心的"扫码"而不是相机应用。"扫码"可以将二维码内容复制到剪贴板,而不仅仅是搜索它。
在 Android 上,内置相机应用应该可以将二维码内容复制到剪贴板。Google 镜头应用似乎也可以正常工作。
开发
假设您已经安装了 Rust,从 git 本地运行最新版本:
- 拉取此仓库
- 运行测试:
cargo test
- 获取帮助:
cargo run -- -h
- 从标准输入加密:
echo "Hello World" | cargo run -- --title="来自标准输入的秘密" --out="stdin.pdf"
- 以最大详细程度运行:
echo "Hello World" | cargo run -- -vvvv
发布
当 git 中标记新版本时,会在 GitHub 上编译和发布。
使用 cargo release 标记和发布新版本,例如:
cargo release 1.2.3
⚠️ 在命令后附加 --execute
以实际执行发布。
许可证和致谢
PaperAge 根据 MIT 许可证发布。详情请参阅 LICENSE.txt。
包含 SIL 开放字体许可的 IBM Plex Mono 字体。请参阅 IBMPlexMono-LICENSE.txt。
使用来自 github.com/str4d/rage 的 Age 的 Rust 实现和 printpdf 库。
感谢 Ariel Salminen 提供 PaperAge 图标。