在这里https://security.stackexchange.com/a/52564您可以阅读到较新的 OpenSSH 版本使用 bcrypt 来保护密钥文件。bcrypt 的安全性取决于成本因素,请参阅https://security.stackexchange.com/questions/139721/estimate-the-time-to-crack-passwords-using-bcrypt/201965#201965
根据https://crypto.stackexchange.com/questions/58536/how-does-openssh-use-bcrypt-to-set-ivs/58543#58543,默认的 bcrypt 轮数为 16。这将是一个很好的安全性. 但是如何获得回合数/成本因素?
到目前为止我所做的:密钥看起来像(为了让它更短,这里只有一个弱的 1024 位密钥)
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAACmFlczI1Ni1jdHIAAAAGYmNyeXB0AAAAGAAAABBLF8sO2Q
hcLXI43z96e1hiAAAAEAAAAAEAAACXAAAAB3NzaC1yc2EAAAADAQABAAAAgQC0gBWeZpej
9ILT/59bEb0/lSvXx0WfZqP2lXRDbuY+gluuWyT+REQcVTR2BxSx9F/P20mLTnupzY+XE3
xEu+SIJlwKIAH3fed62+QBzDrPsl9kyfoIGIvi/28ZftqVN/kg0GSOaAqu4Px+vNVX1VKn
PNV5VVCZWL4ZPlGQZ48UJwAAAhCwDkueKT9oq8E0qtD92/4DSAD2eTI7bd6jBGUxugEw85
6xWbRYnFQZdwO2ZCNV0aTHViD1FRKlC9cBHDoSORKcM/9dY9Msy6lZj7Tp5s8r7x2pOrJi
TVRbv5/cI732I+l/vYvssJEhZpeSw4JKh9tyPpifVmzBxqtqwkBrTuLCMqkwLmrcxReFUq
aA/RIZy3L616CJsAvx2ezEc49D6SbJ9i9OlKuv73a1baS4RpMvFzWGLE2NBvvtQpEnJFoL
Kyjz+two4doT6SZ7UtiVGyCtO5WQEoeAgjhkbZzOPtM2AvoV+hNLRIX2/52jOB5A1bNQ0v
qW64aj2YNe8vWfj5xtA/8BlyEG7gwhu+0HgbgMDxw7o/0qVkHM/Hv3YgBTRygsH+8h4wsR
kxA292NOKKaD18tv1j3atR80q0XQVcQH20uX8tSqXtKfDtkUc/EPbFCNp3xQJG/F81USKh
YAmjxEeDkZZ/LkEOEJKvFRCL3gFlH4rqF5/pRk6HmB99xceD4irbazm+BWfPAf5Q0zdB5L
/yei3sqA4G48yRXIkaELtYNEeTYHMp3PGz1b3CP3l+ZGZp6XNaM+sMfdICbI3Zae5bnxKg
VXEE2UMdi7DEXbqEzSlfcIf5QzXHMQJm0ZL+iLoaEmakamAxCKk6jJ+QzHzGADZEIRXrj3
5Nhhd0jsToEMsXmmawt2qxy0cIHET1M=
-----END OPENSSH PRIVATE KEY-----
密码是test
然后让我们解码base64。因此必须删除以'-----'开头的第一行和最后一行
cat key | tail -n +2 | head -n -1 | base64 -d > text.txt
但现在我不知道如何从那里读取roundcount。你能帮忙吗?
拿你的base64,把它解码成十六进制:
规范定义了该数据的格式。然后我们可以将数据分开:
KDF 选项字符串
您想要的部分是字符串kdfOptions:
规范解释:
换句话说:
我怀疑他们的意思是“回合”。我认为他们的意思是CostFactor。
但它就在那里。
Bcrypt 不是 KDF
BCrypt 不是密钥派生函数;这是一个密码存储功能。您不能使用 bcrypt 生成“密钥”。例如,如果您想“派生”一个 AES-256 位密钥:bcrypt 无法做到。
那是因为 bcrypt 不是密钥派生函数。
BCrypt 是一个密码散列函数。
以这种方式滥用 bcrypt 是一种可憎的行为,也是一种反人类罪。
有关 bcrypt 作为密码散列函数而不是密钥派生函数的更多信息,请参见https://crypto.stackexchange.com/a/70783
一些额外的信息。回顾一下新 ssh 密钥的密码保护是非常安全的。
创建密钥或更改密码时,您可以使用
-a <number of rounds>
.这是在旧的 i3-3220 上完成的,大约需要 Ryzen 7 5700U 一半的时间。所以回合确实是回合而不是成本因素。
要确定您的密钥是否是新格式,请使用
cat key | tail -n +2 | head -n -1 | base64 -d | head -n 2
如果您看到aes256-ctrbcrypt
,那么您的密钥是新格式。为了估计它对暴力密码猜测的安全性,我使用了 John the ripper。Hashcat 目前(2022 年 3 月)不支持这种格式,请参阅https://hashcat.net/forum/thread-10662.html 为开膛手约翰预构建的二进制文件也可能不包含用于破解这种新型 ssh 密钥的必要模块格式。
编译 John 后,开膛手转到
run
目录并通过 SSH 密钥文件创建哈希python3 ssh2john.py <keyfile> > hash.txt
现在通过
./john hash.txt
. 程序将使用随附的密码列表。在 AMD Ryzen 7 5700U 上,它可以尝试大约 132 PW/s (c/s),这是一个非常低的数字。这只是 CPU。当通过-a 32
数字将轮次更改为 32 时,预期会减半(65 PW/s)。为了估计使用 GPU 可能会发生什么,我还使用了 MD5 加密哈希,并且使用这个 John the Ripper 每秒能够尝试大约 712,000 个密码,因此速度快了大约 5400 倍。
当你将它与 GTX1080 进行比较时,它每秒能够使用 MD5Crypt https://gist.github.com/epixoip/a83d38f412b4737e99bbef804a270c40处理大约 1000 万个密码, 所以如果这是线性的,那么 GTX 1080 比 Ryzen 7 5700U 快大约 14 倍,所以只有大约 1850 PW/s 应该是可能的。
所以目前的 sshkey 加密对于离线攻击是相当安全的。
最后,一个小 python 脚本接受
filename="test.key"
你的 ssh 密钥,如果它是 bcrypt 格式,它会显示盐和成本因素。