2012-07-09 84 views
6

可能重复:
Secure hash and salt for PHP passwords使用MD5确保即使其难度

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

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

是一个安全的方式去做这个?是甚至解决了吗?

+8

他们如何验证密码一旦哈希?另外'mt_rand'将int作为参数,而不是字符串。 – 2012-07-09 18:17:21

+1

啊,@火箭什么问题?? !!! – Engineer 2012-07-09 18:19:43

+0

我个人使用[phpass](http://www.openwall.com/phpass/)。 – 2012-07-09 18:22:35

回答

6

这不仅是不安全,它甚至不工作。

mt_rand需要两个参数,一个最小值和一个最大值。

mt_rand('password', 15) 

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

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

这然后产生一个唯一的ID,和来自前一步骤,以预先考虑它的随机数:计算是这样的:

144ffb22886d58e1.82100749 

即字符串然后md5'd。

正如您可以看到,这个代码是100%没有用的。原始密码被转换为0并永远丢失,所以你所做的只是散列随机数,这是毫无意义的。现在你已经有了散列,没有办法再次验证它。由于密码被转换,无论用户输入什么都不重要。

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

就个人而言,我用的是phpass library。它很安全,而且使用简单。

+0

可以说,如果我使用'mt_rand()'就像这样,'md5(uniqid('passwrd',true));'那更好吗? – itsme 2012-07-09 18:32:05

+0

@itsme:问题在于:您以后如何验证密码?您需要能够稍后生成相同的散列,并且不能使用'uniqid'来完成。 ['uniqid'](http://php.net/manual/en/function.uniqid.php)不适用于密码,它用于生成唯一的ID(如UUID)。 – 2012-07-09 18:35:03

+1

为什么是-1?这个答案有什么问题? – 2012-07-09 18:37:34

2

说实话,我甚至不会使用MD5作为存储密码的哈希算法。我会考虑使用类似bcrypt的东西。此外,我甚至不知道你的例子会如何工作,但是无论如何,如果你想确保它的安全,那么至少应该远离md5,sha1,并从别人那里学习错误并使用盐。

+0

我认为,如果您使用良好的盐,md5可以是安全的,但我同意新的算法是可行的。 – 2012-07-09 18:19:48

+1

@Rocket如果你使用md5()只是用一个盐散列密码,它是不安全的 – PeeHaa 2012-07-09 18:21:19

+0

MD5已经在性能方面进行了超级优化,因此在某些情况下,它仍然是可行的,但我仍然不会建议MD5安全地实现密码散列。 – sean 2012-07-09 18:23:33

11

不,它不是一种安全的方式。它是可破解的,在你的例子中,它是不可重复的。您必须将随机值与散列本身一起存储。如果数据库受到威胁,那么使用哈希变得非常简单。

你应该知道,MD5和SHA1是两个最弱的哈希算法,这是在PHP可用。

更好的是使用crypt()函数,用CRYPT_BLOWFISHPBKDF2

更新

而且,PeeHaa提到,这是行不通的。 mt_rand('password', 15)将导致Warning: mt_rand() expects parameter 1 to be long, string given on line X

+0

@PeeHaa,嗯,是的,因为它不可重复。 – 2012-07-09 18:24:44