根据RFC 4880,
字符串到密钥 (S2K) 说明符用于将密码字符串转换为对称密钥加密/解密密钥。目前,它们在两个地方使用:加密私钥环中私钥的秘密部分,并将密码转换为对称加密消息的加密密钥。
后者的工作原理是:
前者,对于私钥的秘密部分,不具有以下功能:
gpg2 --s2k-cipher-algo AES256 --s2k-digest-algo SHA512 --s2k-mode 3 --s2k-count 65000000 --export-secret-keys | gpg2 --list-packets
显示的结果包括:
iter+salt S2K, **algo: 7**, **SHA1 protection**, **hash: 2**,
**protect count: 13107200**.
因此,与预期相比,这是一次谨慎的、事实上的降级,降级为 AES128 和 GPU 友好的 SHA-1。这个问题被提出来这里(大约 42 个月前),经过两年的不作为之后,这个问题的紧迫性逐渐降低。
Gpg-agent 有一个默认值,限制 KDF 所需的时间。
我们能做什么让 s2k 说明符完全发挥作用?
(或者至少得到与显著增加迭代次数相同的效果,这使得密码破解对攻击者来说很难)
答案1
或者至少达到显著增加迭代次数的相同效果,这使得攻击者很难破解密码
不是 gpg 但是gpg-代理负责处理明文私钥。如果在密钥创建期间提供了密码或口令,它会在将私钥存储到磁盘之前对其进行加密。
大多数情况下,密码和口令既不会太弱也不会太强。为了使所有这些不太强的密码和口令更能抵御暴力攻击,gpg-agent 不会立即使用它们,而是使用一种称为按键拉伸或者s2k进一步来说。
s2k 数量是可配置的,可以增加以提高对暴力破解的防御能力。
来自 gpg-agent手册页
--s2k-calibration milliseconds
将默认校准时间更改为毫秒。给定值的上限为 60 秒;值为 0 时将重置为编译后的默认值。此选项在 SIGHUP(或 gpgconf --reload gpg-agent)上重新读取,然后重新校准 S2K 计数。
--s2k-count n
指定用于保护密码的迭代次数。此选项可用于覆盖默认的自动校准。自动校准计算一个计数,默认情况下需要 100ms 来破坏给定的密码。另请参阅 --s2k-calibration。
--s2k-calibration
是在版本 2.2.12 中添加的(该版本在提出问题半年后发布)。通常人们会将这些选项放在配置文件中,即 ~/.gnupg/gpg-agent.conf。
如果您不想担心密钥延长,请考虑将私钥保存在 OpenPGP 智能卡上(例如 Nitrokey、Yubikey)。这样,您只需记住两个无法被暴力破解的 PIN 码。