在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;
请告诉我这段代码是否足以在破解加密算法时保护我的密码。
答案 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版本的选项。