2024-01-26 更新对 OpenSSH 密钥的生成逻辑调研文档
OpenSSH 的 passphrase 是如何实现的?是否足够安全?
首先 Google 了下,一些相关的文章:
在 OpenSSH release notes 中搜索 passphrase 跟 kdf,关键信息如下:
OpenSSH 9.4/9.4p1 (2023-08-10)
* ssh-keygen(1): increase the default work factor (rounds) for the
bcrypt KDF used to derive symmetric encryption keys for passphrase
protected key files by 50%.
----------------------------------
OpenSSH 6.5/6.5p1 (2014-01-30)
* Add a new private key format that uses a bcrypt KDF to better
protect keys at rest. This format is used unconditionally for
Ed25519 keys, but may be requested when generating or saving
existing keys of other types via the -o ssh-keygen(1) option.
We intend to make the new format the default in the near future.
Details of the new format are in the PROTOCOL.key file.
所以从 2014 年发布的 OpenSSH 6.5 开始,ed25519 密钥的 passphrase 才是使用 bcrypt KDF 生成的。
而对于其他类型的密钥,仍旧长期使用基于 MD5 hash 的密钥格式,可以说毫无安全性可言。
我进一步看了 man ssh-keygen
的文档,没找到任何修改 KDF 算法的参数,不过能通过 -a 参数来修改 KDF 的 rounds 数量,
OpeSSh 9.4 的 man 信息中写了默认使用 16 rounds.
因为大部分人都使用默认参数生成 Key,而且绝大部分用户都没有密码学基础,大概率不知道 KDF、Rounds 是什么意思。
在 relase note 中我进一步找到这个:
OpenSSH 9.5/9.5p1 (2023-10-04)
Potentially incompatible changes
--------------------------------
* ssh-keygen(1): generate Ed25519 keys by default. Ed25519 public keys
are very convenient due to their small size. Ed25519 keys are
specified in RFC 8709 and OpenSSH has supported them since version 6.5
(January 2014).
9.5 开始才是默认生成 ED25519 的 ssh key,所以可以推断出,目前大部分人使用的 ssh key,大概率加密方式都很糟糕。
不加 passphrase 就是裸奔,加了也很容易被破解。
总结下,在不考虑其他硬件密钥/SSH CA 的情况下,最佳的 SSH Key 生成方式应该是:
ssh-keygen -t ed25519 -a 256 -C "xxx@xxx"
即使用 ED25519 密钥,KDF rounds 也要调到比默认值更高,这样生成的密钥才能更安全。
rounds 的值根据你本地的 CPU 性能来定,
我在 Macbook Pro M2 上测了下,64 rounds 大概是 0.5s,128 rounds 大概需要 1s,256 rounds 大概 2s,用时与 rounds 值是线性关系。
考虑到我的个人电脑性能都还挺不错,而且只需要在每次重启电脑后通过 ssh-add ~/.ssh/xxx
解锁一次,后续就一直使用内存中的密钥了,一两秒的时间还是可以接受的。
SSH CA - 更安全合理的 SSH 密钥管理方案?
搜到些资料:
TODO