为什么PHP中的CRYPT_BLOWFISH被认为更适合密码散列,当它产生比CRYPT_SHA-256/512更短的散列时?是不是更有可能找到另一个计算相同BLOWFISH散列的单词,而不是SHA256 / 512散列?
来自php.net手册的示例哈希:
Blowfish: $2a$07$usesomesillystringfore2uDLvp1Ii2e./U9C8sBjqp8I90dH6hi
SHA-256: $5$rounds=5000$usesomesillystri$KqJWpanXZHKq2BOB43TSaYhEWsQ1Lr5QNyPCDH/Tp.6
SHA-512: $6$rounds=5000$usesomesillystri$D4IrlXatmP7rx3P3InaxBeoomnAihCKRVQP22JZ6EY47Wc6BkroIuUUBOov1i.S5KPgErtP/EN5mcO.ChWQW21
答案 0 :(得分:2)
使用bcrypt使其安全的事情是它的计算速度比任何其他算法慢得多。
使用SHA版本,您可以获得更好的计算机,并且您将能够立即制作彩虹表。使用bcrypt它仍然需要很长时间,这个算法是时间昂贵的。因此几乎不可能从散列中检索原始密码。
您可以看到此link for more information。 您还可以从Security StackExchange中看到this thread,它涵盖了它!
关于哈希产品较小的事实,它根本不重要,因为正如我所说,如果你想找到哈希来自哪个密码,它需要很长时间。
见this sandbox。只需将负载系数超过15即可使执行时间超过3秒。试着玩它,你会明白为什么它是安全的。
沙箱中的代码:
$time = microtime(true);
$pass = crypt('myNewPassword', '$2y$15$usesomesillystringforsalt$');
$end_time = microtime(true);
$diff = $end_time - $time;
echo "$pass\n$diff"
输出:
$ 2Y $ 15 $ usesomesillystringforeTfp6 / FuUgyb1HKFA36V9tf6Go5xlv /一个
2.4688489437103
1个哈希需要2.5秒!想象一下,试图破解数以百万计的密码!