在使用ssh-keygen生成SSH密钥对时,选择多少个密钥派生函数(KDF)轮次/迭代的最佳实践是什么?

我是否正确地说密码短语足够强大是没有必要的吗?给定密码短语长度和KDF轮次,破解私钥需要多长时间是否存在某种公式?

我的猜测是,生成Ed25519密钥时的默认值16小足以使用户几乎无法察觉其正常使用(从命令行登录到服务器),但会给任何蛮力尝试增加可观的费用。我想知道是否值得增加它。

评论

可以肯定的是,我们在这里谈论的是基于密码的密钥派生函数(又名迭代哈希函数)的迭代计数?如果是这样,通常认为16个回合太低了。如今,敏感数据通常会达到100k以上(并且在大多数系统上仍不到一秒钟)。
我正在谈论ssh-keygen中的-o选项,例如ssh-keygen -o -a 100 -t ed25519(请参见blog.g3rt.nl/upgrade-your-ssh-keys.html)。 100k会花很多时间,所以我想这与您的想法有所不同?

不必使KDF变得棘手,您可以选择更难破解的密钥来增加攻击者的工作量。有关更多信息,请参见此答案。选择您的不便之处:等待或输入长密码。 :)

对Ed25519进行了以下测试:--a 100--a 1000--a 100000--a 1000000--a 1000000000 ...但没有注意到显着差异。这是正常行为吗?为具有未加密主文件夹的测试创建了单独的用户。是否清除测试:下一次测试之前,删除了客户端中的先前密钥(例如,以避免RSA回退)和服务器中的authorized_keys文件。还创建了1个MiB,10个MiB文件,并尝试使用scp复制。经过测试的登录方式:对于{1..5}中的x;执行/ usr / bin / time ssh user @ IP出口;对{1..5}中的x执行并进行scp;执行/ usr / bin / time scp test1MiB .img user @ IP:/ home / user /;完成(重复te

@ zeroconf + Peter:但是如果您在ssh-agent或类似工具中拥有密钥(例如,某些Linux发行版或GUI为方便起见),则不会,当然,如果您没有首先设置密码,则不会。

#1 楼

我也曾尝试在MacBook Pro Mid14(i7)中尝试为-a标志找到一个不错的值,尝试登录Debian 8.5,结果如下:



-a 1000大约需要20秒左右。 >
-a 100(默认值)〜2s〜2.5s。

最后我坚持默认值,因为我不是偏执狂,我不想等待,但是在我的研究中确实发现选择-a 64的值并不罕见。

评论


$ \ begingroup $
您的测试方法错误。最小值可能接近真实值,但最大值相去甚远。您的笔记本电脑有时会忙于做其他事情,或者有其他因素在起作用。结果应该是确定性的,并遵循可预测的曲线,但显然不会(您说的是-a 64比-a 100慢-在三分之一的情况下,假设分布均匀)。
$ \ endgroup $
–吕克
18/12/27在19:43

$ \ begingroup $
@Luc,您好,是的,我确实所做的只是写下我的观察结果,而不关心测试方法,感谢读者的注意。新年快乐= D
$ \ endgroup $
–ZzAntáres
19年1月1日,下午1:54

$ \ begingroup $
您应该使用time实用程序或内置函数,而不是看到它们花费多长时间。假设系统负载不太重,这将解决大多数调度问题。
$ \ endgroup $
–森林
19年7月9日在6:49



#2 楼

新格式使用bcrypt_pbkdf()派生对称密钥。在工作方面,这与普通bcrypt的行为略有不同。

写bcrypt_pbkdf()的Per Ted Unangst:


bcrypt的原始难度参数是
的log2次数,以重新加密密码。 bhash将此数字固定为64,而
依靠PBKDF2的rounds参数来控制难度。 / bcrypt-pbkdf

由于每次迭代都对密钥进行64次密钥更新,因此默认的16轮校验将总共执行1024次密钥更新操作,这等于原始bcrypt的工作因子为10。

您可以在此处阅读有关选择KDF轮数的更多信息。

#3 楼

越慢越好,您可以忍受的越慢。不同-a值的计时,每次测量20次:

-a 16 takes on average 0.247 (seconds)
-a 32 takes on average 0.586
-a 64 takes on average 1.206
-a 100 takes on average 1.962
-a 150 takes on average 2.664


时间是线性的,因此可以预期将-a值加倍会花费两倍的时间。默认值(16)在2018年使用合理的i5 CPU大约需要四分之一秒(并且每18个月CPU的每秒操作次数几乎不会翻番)。


测量方法

通过更改密钥上的密码(因为它不等待/dev/random)来测量:

time ssh-keygen -qa 16 -N newpassword -pP oldpassword -f keyfile


为了创建概述,我使用了这段代码(每个-a值运行命令20次):可能是由于CPU节流(我的笔记本电脑在超过40°C时可笑地节流了,这是一个错误)。但是,这些看上去比ZzAntáres回答中的数字更加稳定和明智。以下是每个回合设置的10轮运行的原始值:

$ for j in 16 32 64 100 150; do
>     echo -n "-a $j takes on average";
>     for i in {1..20}; do
>         ssh-keygen -qa $j -t ed25519 -f test -N test;
>         time ssh-keygen -qa $j -N tost -pP test -f test;
>         rm test{.pub,};
>     done |& grep real | awk -F m '{print }' | tr -d s | awk '{sum+=} END{print sum/NR}';
> done


评论


$ \ begingroup $
从其他答案中得出:-a在2016年为100:<5秒。在2018年:<2秒。 2020年:<0.5s(现在测量)。
$ \ endgroup $
– gcb
20年8月24日,0:11

$ \ begingroup $
@gcb对我来说,在新笔记本电脑上几乎没有变化(现在对我来说是1.7s),cpus并没有真正变得越来越快(只是更加并行化了)。如果您获得0.5s,则可能是使用台式机,而不是他们在商用笔记本电脑中使用的这些笨拙的移动CPU。另外,2016年的“ 3.5-6s”是一种荒谬的测试方法,完全没有道理;您最好查看CPU基准测试和估算。例如,在我当前的笔记本电脑中,我的2012 CPU比2016年第四季度CPU具有更高的基准点;确实不再每年增加一倍……他们只是使用更少的电量(速度变慢,哇!)
$ \ endgroup $
–吕克
20年8月24日10:49