OpenSSH 和 GPG 都可以生成密钥对,这些密钥对作为文件存储在用户目录内的知名路径中。在生成过程中始终要求输入密码,然后使用对称加密算法对私钥的内容进行加密。
我想知道这些程序在使用之前是否也在密码短语中应用了密钥拉伸技术,例如 PBKDF2 或 scrypt。假设其中一个文件被泄露,我想确保在商品硬件上获取真正的解密密钥大约需要 10-20 秒,因此暂时无法进行暴力攻击。这甚至可能吗?
OpenSSH 和 GPG 都可以生成密钥对,这些密钥对作为文件存储在用户目录内的知名路径中。在生成过程中始终要求输入密码,然后使用对称加密算法对私钥的内容进行加密。
我想知道这些程序在使用之前是否也在密码短语中应用了密钥拉伸技术,例如 PBKDF2 或 scrypt。假设其中一个文件被泄露,我想确保在商品硬件上获取真正的解密密钥大约需要 10-20 秒,因此暂时无法进行暴力攻击。这甚至可能吗?
从 6.5 版开始,OpenSSH 提供了一种支持 bcrypt KDF 的新私钥格式。可以通过将-o
标志传递给ssh-keygen
. 可以使用-a
标志自定义 KDF 轮数。
$ ssh-keygen -o -a 1000
参考:ssh-keygen 手册页和Ted Unangst 的博客。
我找不到任何与上述命令标志等效的东西。如果有,请在评论中告诉我,我会更新答案。
OpenSSH - Line 3090:sshkey.c:sshkey_private_to_blob2
if (strcmp(kdfname, "bcrypt") == 0) {
arc4random_buf(salt, SALT_LEN);
if (bcrypt_pbkdf(passphrase, strlen(passphrase),
salt, SALT_LEN, key, keylen + ivlen, rounds) < 0) {
r = SSH_ERR_INVALID_ARGUMENT;
goto out;
}
if ((r = sshbuf_put_string(kdf, salt, SALT_LEN)) != 0 ||
(r = sshbuf_put_u32(kdf, rounds)) != 0)
goto out;
} else if (strcmp(kdfname, "none") != 0) {
/* Unsupported KDF type */
r = SSH_ERR_KEY_UNKNOWN_CIPHER;
goto out;
}
GPG 允许您选择您想要的散列算法,只要它受GCrypt 库支持。
哈希算法(MD4、MD5、RIPE-MD160、SHA-1、SHA_224、SHA-256、SHA-384、SHA-512、TIGER-192、Whirlpool)、MAC(所有哈希算法的 HMAC)、
可以使用基于密码的加密算法(例如,[PKCS#5] 中描述的算法之一)来加密私钥信息。
PKCS5 RFC2898仅列出了用于密钥派生功能的 PBKDF1 和 PBKDF2。