PHP安全方面为什么不再认为MD5是安全的?

7

作为一名php开发人员,我长期以来一直使用md5散列算法来保护密码数据和生成唯一的散列算法。

然而,在过去的几个月中,我听到了有关md5不再被认为是安全的传言,我想知道为什么?

有哪些密码身份验证替代方案,例如SHA1、PHP 5.5中的password_hash()?我想知道为什么这些替代方案现在被认为是更好的选择,因为对我来说,这些大多数只是另一种散列算法...


在维基百科上阅读它的历史:http://en.wikipedia.org/wiki/MD5 - Funk Forty Niner
@Fred-ii- 在哪里可以找到历史记录说明为什么它不再安全? - mahen3d
你没有阅读我提供的链接中的任何内容吗? - Funk Forty Niner
1
请阅读由一位拥有255k会员身份的用户在SO上发布的答案 - Funk Forty Niner
或者,你可以继续使用它,并最终自己发现。艰难学习是一种学习方式。祝你好运。 - Funk Forty Niner
2个回答

4

因为许多网站和研究已经证明,md5()可以被反向解密,您应该停止使用它!

简单来说...

enter image description here

在PHP 5.5中,您可以很好地使用password_hash()crypt(),这两个函数目前被认为是更好的选择。

一个password_hash()的简单示例:

<?php
$options = [
    'cost' => 12,
];
echo password_hash("rasmuslerdorf", PASSWORD_BCRYPT, $options)."\n";
?>

一份使用BLOWFISH算法的crypt简单示例。
if (CRYPT_BLOWFISH == 1) {
    echo 'Blowfish:     ' . crypt('rasmuslerdorf', '$2a$07$usesomesillystringforsalt$') . "\n";
}

编辑 :

为什么不应该使用 md5()

像 MD5、SHA1 和 SHA256 这样的哈希算法被设计为非常快速和高效。随着现代技术和计算机设备的发展,通过“暴力破解”这些算法的输出以确定原始输入已变得微不足道。由于现代计算机可以非常快地“反向”这些哈希算法,因此许多安全专业人士强烈建议不要将其用于密码哈希。

为什么选择 PHP 5.5 上的 password_hash()

在哈希密码时,最重要的考虑因素是计算开销和盐值。哈希算法的计算开销越大,破解其输出所需的时间就越长。PHP 5.5 提供了一个本地密码哈希 API,即 password_hash(),它以安全的方式处理哈希和验证密码。

来源


1
你也可以考虑使用 bcrypt。我发现它非常适合我的需求。Github链接 - Ohgodwhy
1
不需要。你的答案已经非常好了,我只是加上我的两分意见 :) - Ohgodwhy
1
@Fred-ii-,这是因为password_hash()函数只在PHP 5.5及以上版本中可用,而在此之前的版本中不可用。 - Shankar Narayana Damodaran
1
是的,我注意到了,即使那时你也不必这么做,但非常非常棒!我投票关闭为“不清楚在问什么”。@ShankarDamodaran - 似乎这里无法取悦。顺便说一下,有趣的图形!哈哈 - Funk Forty Niner
2
@Shankar Damodaran:我的看法是:没有必要复制内容,也不要从PHP手册中复制(并且你甚至忘记了给出引用)。同时,我想知道你分享的这个研究如何相关。你贴出的图片对于我的问题来说有点过于简略,尤其是因为还包含了重复的材料。 - hakre
显示剩余8条评论

1

它很快。如果攻击者得到了您的数据库备份,他们可能只需要几个小时(也许只需要几分钟)就能破解散列密码——算法越快,每秒尝试次数越多=越不安全。

SHA-256 / SHA-512 是更好的选择,因为它们需要更长的处理时间,因此可以将破解一个哈希所需的时间延长数年之久。虽然不确定黑客们是否会这样做,但我没有时间或耐心去尝试。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接