我看到有人像这样编码密码哈希,
md5(uniqid(mt_rand('password', 15), true));
是一种安全的方式吗?那是不是很有效?
答案 0 :(得分:11)
不,这不是一种安全的方式。它是可以破解的,在你的例子中,它是不可重复的。您必须使用散列本身存储随机值long。如果数据库被泄露,那么强制执行哈希变得非常简单。
你应该知道MD5和SHA1是PHP中最弱的两种散列算法。
使用crypt()
功能,CRYPT_BLOWFISH
或PBKDF2会更好。
<强>更新强>
另外,正如PeeHaa所说,它不起作用。 mt_rand('password', 15)
将导致Warning: mt_rand() expects parameter 1 to be long, string given on line X
。
答案 1 :(得分:6)
这不仅不安全,甚至不起作用。
mt_rand
需要2个参数,最小值和最大值。
mt_rand('password', 15)
这会将'password'
转换为int(0
),然后在0
和15
之间返回一个随机数。
uniqid(mt_rand('password', 15), true)
然后生成一个唯一的ID,并将上一步中的随机数加到它上面:计算如下内容:
144ffb22886d58e1.82100749
那个字符串然后是md5'd。
正如您可能看到的,此代码是100%无用的。原始密码将转换为0
并永久丢失,因此您所做的只是散列随机数,这是毫无意义的。既然你有哈希,就无法再次验证它。由于密码已转换,无论用户输入什么都无关紧要。
所以,不,这段代码不安全,不要使用它。
就个人而言,我使用phpass library。它安全且易于使用。
答案 2 :(得分:2)
老实说,我甚至不会使用md5作为存储密码的哈希算法。我会考虑使用像bcrypt这样的东西。此外,我甚至不知道你的例子是如何工作的,但无论如何如果你想要保护它,那么至少要远离md5,sha1并从别人那里学习错误并使用盐。