可能重复:
PHP 密码的安全哈希和盐
我看到有人像这样编写密码哈希,
md5(uniqid(mt_rand('password', 15), true));
这是一种安全的方法吗?这甚至解决了吗?
不,这不是一种安全的方式。它是可破解的,在您的示例中,它是不可重复的。您必须将随机值与散列本身一起存储。如果数据库被破坏,那么暴力破解哈希变得非常简单。
您应该知道 MD5 和 SHA1 是 PHP 中可用的两种最弱的散列算法。
更好的是使用crypt()
函数,with CRYPT_BLOWFISH
or PBKDF2。
更新
此外,正如 PeeHaa 所提到的,它不起作用。将mt_rand('password', 15)
导致Warning: mt_rand() expects parameter 1 to be long, string given on line X
.
这不仅不安全,甚至不起作用。
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 库。它安全且易于使用。
老实说,我什至不会使用 md5 作为存储密码的散列算法。我会考虑使用类似 bcrypt 的东西。另外我什至不明白你的例子是如何工作的,但无论如何,如果你想保护它,那么至少远离 md5、sha1 并从其他错误中学习并使用盐。