请有人帮我看看我的代码是否足以保护密码

时间:2014-06-12 08:29:13

标签: php

在change_password.php中,我这样做:

UPDATE 'ussers' SET
'pass' = substr(md5( substr( md5($pass), 5, 5) ), 5, 5)
WHERE 'userid' = $userid;

在login.php中,我按照这样的方式进行检查:

SELECT * FROM 'users' WHERE
'pass' = substr(md5( substr( md5($pass), 5, 5) ), 5, 5) AND 'userid' = $userid;

请告诉我这段代码是否足以在破解加密算法时保护我的密码。

3 个答案:

答案 0 :(得分:2)

不,不是。

MD5足够弱,可以在几个小时内使用GPU装备进行暴力破解,并且不会截断它! Double MD5ing不会增加额外的重要产量,而截断则坦率地说是不合理的。

您需要查看更多现代方案,例如Blowfish和密码腌制。

如果您认为使用GPU的暴力破坏的危险被夸大了,请参阅http://arstechnica.com/security/2012/12/25-gpu-cluster-cracks-every-standard-windows-password-in-6-hours/

答案 1 :(得分:0)

你的方式很弱。 md5校验和中只有5个字符,只有超过100万个值,所有攻击者都需要查找冲突。不要使用substr(),使用salt存储完整哈希,并使用更强的哈希函数,如sha256。

答案 2 :(得分:0)

一般情况下,你不想尝试推出自己的加密,因为那里有许多优秀的算法,而且自制的算法更容易出现错误或缺点。

在您的特定情况下,两个主要缺点是使用子字符串并使用md5。

<强>子串

获取md5哈希的子字符串可减少算法产生的可能哈希值,从而增加冲突的可能性。以极端情况为例,我们只使用md5哈希的第一个字符。我们现在的情况是,任何密码都有1/16的机会与任何其他密码具有相同的哈希值!更糟糕的暴力迫使这将花费很少的时间。

您的示例使用的长度为5,但这仍然非常容易暴力,并且很有可能发生碰撞。以下是创建1,000,000个哈希值的脚本的输出(使用uniqid生成值):

  

创建的哈希数量1000000
  独特的哈希值481247
  碰撞518753

<强> MD5

MD5很快。对于某些应用程序,这可能是一件好事 - 比如检查文件是否准确重复。但是对于密码,这意味着攻击者检查大量密码的速度也很快。此外,MD5中存在许多漏洞。

<强>替代

PHP 5.5提供了一个密码api,可以简化生成密码并且看起来很容易使用(诚然,我自己没有使用它)。这也需要选择一个强大的算法。 http://www.php.net/manual/en/book.password.php

This question有很多其他PHP版本的选项。