6

可能重复:
PHP 密码的安全哈希和盐

我看到有人像这样编写密码哈希,

md5(uniqid(mt_rand('password', 15), true));

这是一种安全的方法吗?这甚至解决了吗?

4

3 回答 3

11

不,这不是一种安全的方式。它是可破解的,在您的示例中,它是不可重复的。您必须将随机值与散列本身一起存储。如果数据库被破坏,那么暴力破解哈希变得非常简单。

您应该知道 MD5 和 SHA1 是 PHP 中可用的两种最弱的散列算法。

更好的是使用crypt()函数,with CRYPT_BLOWFISHor PBKDF2

更新

此外,正如 PeeHaa 所提到的,它不起作用。将mt_rand('password', 15)导致Warning: mt_rand() expects parameter 1 to be long, string given on line X.

于 2012-07-09T18:20:51.747 回答
6

这不仅不安全,甚至不起作用。

mt_rand接受 2 个参数,一个最小值和一个最大值。

mt_rand('password', 15)

这将转换'password'为 int ( ),然后返回和0之间的随机数。015

uniqid(mt_rand('password', 15), true)

然后,这会生成一个唯一的 ID,并将上一步中的随机数添加到它之前:计算如下:

144ffb22886d58e1.82100749

该字符串然后是 md5'd。

如您所见,此代码 100% 无用。原始密码被转换0并永远丢失,所以你所做的只是散列随机数,这是没有意义的。既然您有了哈希,就无法再次验证它。由于密码已转换,因此用户输入的任何内容都无关紧要。

所以,不,这个代码不安全,不要使用它。

就个人而言,我使用phpass 库。它安全且易于使用。

于 2012-07-09T18:29:46.437 回答
2

老实说,我什至不会使用 md5 作为存储密码的散列算法。我会考虑使用类似 bcrypt 的东西。另外我什至不明白你的例子是如何工作的,但无论如何,如果你想保护它,那么至少远离 md5、sha1 并从其他错误中学习并使用盐。

于 2012-07-09T18:18:42.493 回答