s2k 的合理默认值
您可以调整多个参数。通常s2k-mode
应该保持它的默认值 3:这在应用摘要功能期间同时使用盐并重复盐和密码。进一步的参数是对称加密s2k-cipher-algo
算法s2k-digest-algo
(s2k-count
所有这些选项都可以在 GnuPG 配置文件~/.gnupg/gpg.conf
或命令行中设置(--
例如,前缀为--s2k-digest-algo
)。
对于三个“可调”选项,您必须平衡执行时间和安全性。
s2k-cipher-algo
:由于要加密的数据量非常小,因此在加密上花费多少开销并没有显着差异。默认值AES128
应该没问题,但是如果我们不会遭受显着更高的计算工作量,为什么不使用额外的安全边际呢?
s2k-digest-algo
并s2k-count
影响尝试破解密码时花在散列上的时间。默认的 SHA-1 有一些已知的弱点并且被认为是过时的,所以选择一些 SHA-2 套件的算法。在写这个答案时,65011712 次重复和 SHA512 导致每个解密操作都需要一个显着的延迟,但在我的移动 Core i7 上远低于一秒;如果解密的密钥无论如何都被缓存,那么gpg-agent
可能有人可以忍受。
我不知道这里讨论了合理的默认值,通常建议是使散列尽可能昂贵。
我不在乎慢臂处理器。我宁愿再等 100 毫秒,然后让我的密码重复 65011712 次。
如果您真的不介意,“重型”配置将是
s2k-mode 3 # default anyway
s2k-cipher-algo AES256
s2k-digest-algo SHA512
s2k-count 65011712
对于仍然完全正常但速度更快的配置,通过使用较小的s2k-count
or值来减少散列的计算工作量SHA256
。AES128 作为密码很好,但不会导致显着更快的计算。
使用这些默认值进行私钥加密
TL;DR:您需要再次触发保存密钥(例如通过更改密码),因为导出只是从硬盘转储。GnuPG 2.1(现代)受到一个错误的影响。
更长的版本:
您必须区分 OpenPGP/GnuPG 中摘要算法的几种用途。
OpenPGP 指纹
为了计算指纹,OpenPGP要求使用 SHA1 对密钥进行哈希处理,您可以在RFC 4880, Section 12.2, Key IDs and Fingerprints中阅读:
V4 指纹是八位字节 0x99 的 160 位 SHA-1 哈希,后跟两个八位字节的数据包长度,然后是从版本字段开始的整个公钥数据包。
没有选择或可能对此进行配置。我们将进一步观察这一点。
修改检测码包
所述改变检测码的分组也使用SHA-1散列来保护加密的消息从被操纵,没有选择留给进行配置。这与进一步的讨论无关,我只是为了完整性而提到它。
对称加密的会话密钥和数据包
这些包既用于为公钥加密的“普通”OpenPGP 消息(其中它们再次包含文字数据包),也用于使用密码加密的消息。
在第一种情况下,对称密钥使用 RSA 等非对称算法加密,不涉及密码(或此类密码的散列)。
它还可以用于基于密码对消息进行对称加密,例如 using gpg --symmetric
,它将要求输入密码并从 STDIN 进行加密。(pgpdump
类似于 `gpg --list-packets 的工具,但有时提供更合适的输出)输出这样的消息看起来像
$ echo "foo" | gpg --passphrase "bar" --symmetric | pgpdump
Old: Symmetric-Key Encrypted Session Key Packet(tag 3)(13 bytes)
New version(4)
Sym alg - CAST5(sym 3)
Iterated and salted string-to-key(s2k 3):
Hash alg - SHA1(hash 2)
Salt - 1d cd 72 c8 c3 30 df 84
Count - 65536(coded count 96)
New: Symmetrically Encrypted Data Packet(tag 9)(26 bytes)
Encrypted data [sym alg is specified in sym-key encrypted session key]
观察string-to-key
程序的设置:摘要算法(默认为 SHA1)和 mangle 计数。这些可以使用--s2k-digest-algo
和进行配置--s2k-count
。让我们看看如果我们将它们设置为 SHA512 和最大值 65011712 会发生什么:
$ echo "foo" | gpg --passphrase "bar" --s2k-digest-algo SHA512 --s2k-count 65011712 --symmetric | pgpdump
Old: Symmetric-Key Encrypted Session Key Packet(tag 3)(13 bytes)
New version(4)
Sym alg - CAST5(sym 3)
Iterated and salted string-to-key(s2k 3):
Hash alg - SHA512(hash 10)
Salt - ea 62 a1 ff 0b 2b f6 6a
Count - 65011712(coded count 255)
New: Symmetrically Encrypted Data Packet(tag 9)(26 bytes)
Encrypted data [sym alg is specified in sym-key encrypted session key]
我们使用这些选项成功地更改了密码修改--s2k-...
选项。
受密码保护的导出密钥
现在,让我们再看看该string-to-key
过程的另一种用途,即加密导出的密钥。RFC 4880, 5.5.3。Secret-Key Packet Formats表明string-to-key
应该使用相同的过程,但实际上,--s2k-digest-option
不再--s2k-count
有任何效果:
$ gpg --s2k-digest-algo SHA512 --s2k-count 65011712 --export-secret-subkeys 0xDEADBEEF | pgpdump
[snip]
Old: Secret Subkey Packet(tag 7)(510 bytes)
Ver 4 - new
Public key creation time - Mon Jun 1 16:06:06 CEST 2015
Pub alg - RSA Encrypt or Sign(pub 1)
RSA n(1024 bits) - ...
RSA e(17 bits) - ...
Sym alg - CAST5(sym 3)
Iterated and salted string-to-key(s2k 3):
Hash alg - SHA1(hash 2)
Salt - ab 7d c8 36 6a 67 4d dd
Count - 65536(coded count 96)
IV - e9 76 d3 c4 b0 de 24 3c
Encrypted RSA d
Encrypted RSA p
Encrypted RSA q
Encrypted RSA u
Encrypted SHA1 hash
[snip]
这实际上让我困惑了好一阵子。
不过,解决方案相当简单:只需按原样gpg --export
导出密钥。secring.gpg
设置选项gpg --edit-key
(通过参数或gpg.conf
文件)并随后使用passwd
触发器更改密码短语,将加密密钥写入到另一端secring.gpg
- 瞧,密钥按照我们想要的方式加密,我们甚至不必设置--s2k-...
导出期间的选项:
$ gpg --export-secret-subkeys 0xDEADBEEF | pgpdump
[snip]
Old: Secret Subkey Packet(tag 7)(510 bytes)
Ver 4 - new
Public key creation time - Mon Jun 1 16:06:06 CEST 2015
Pub alg - RSA Encrypt or Sign(pub 1)
RSA n(1024 bits) - ...
RSA e(17 bits) - ...
Sym alg - CAST5(sym 3)
Iterated and salted string-to-key(s2k 3):
Hash alg - SHA512(hash 10)
Salt - e1 82 c3 9f 07 74 7f 0c
Count - 65011712(coded count 255)
IV - 97 20 69 ae 8d ec 0d 3c
Encrypted RSA d
Encrypted RSA p
Encrypted RSA q
Encrypted RSA u
Encrypted SHA1 hash
[snip]
GnuPG 2.1(现代)
截至 2015 年 6 月 1 日,GnuPG 2.1(“现代”分支)受到错误的影响(GnuPG 问题 #1800):在这里,gpg-agent
负责所有这些操作,但根本不关心--s2k-...
选项。这应该很快得到解决,因为 GnuPG 的主要开发人员 Werner Koch 已经将该错误标记为紧急。