为什么PHP中的CRYPT_BLOWFISH被认为更好,因为它产生的哈希值比SHA短

参见英文答案 > How do you use bcrypt for hashing passwords in PHP?                                    9个
为什么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

解决方法:

使用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/a
2.4688489437103

1哈希需要2.5秒!想象一下尝试哈希数百万的密码!

上一篇:无法在Java中输出正确的哈希值.怎么了?


下一篇:java – 压缩SHA-256哈希