我看到有人编码这样的密码哈希,
md5(uniqid(mt_rand('password', 15), true));
是一个安全的方式去做这个?是甚至解决了吗?
我看到有人编码这样的密码哈希,
md5(uniqid(mt_rand('password', 15), true));
是一个安全的方式去做这个?是甚至解决了吗?
这不仅是不安全,它甚至不工作。
mt_rand
需要两个参数,一个最小值和一个最大值。
mt_rand('password', 15)
此转换'password'
为int(0
),然后返回0
和15
之间的随机数。
uniqid(mt_rand('password', 15), true)
这然后产生一个唯一的ID,和来自前一步骤,以预先考虑它的随机数:计算是这样的:
144ffb22886d58e1.82100749
即字符串然后md5'd。
正如您可以看到,这个代码是100%没有用的。原始密码被转换为0
并永远丢失,所以你所做的只是散列随机数,这是毫无意义的。现在你已经有了散列,没有办法再次验证它。由于密码被转换,无论用户输入什么都不重要。
所以,不,这个代码是不安全的,不使用它。
就个人而言,我用的是phpass library。它很安全,而且使用简单。
可以说,如果我使用'mt_rand()'就像这样,'md5(uniqid('passwrd',true));'那更好吗? – itsme 2012-07-09 18:32:05
@itsme:问题在于:您以后如何验证密码?您需要能够稍后生成相同的散列,并且不能使用'uniqid'来完成。 ['uniqid'](http://php.net/manual/en/function.uniqid.php)不适用于密码,它用于生成唯一的ID(如UUID)。 – 2012-07-09 18:35:03
为什么是-1?这个答案有什么问题? – 2012-07-09 18:37:34
说实话,我甚至不会使用MD5作为存储密码的哈希算法。我会考虑使用类似bcrypt的东西。此外,我甚至不知道你的例子会如何工作,但是无论如何,如果你想确保它的安全,那么至少应该远离md5,sha1,并从别人那里学习错误并使用盐。
不,它不是一种安全的方式。它是可破解的,在你的例子中,它是不可重复的。您必须将随机值与散列本身一起存储。如果数据库受到威胁,那么使用哈希变得非常简单。
你应该知道,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
。
@PeeHaa,嗯,是的,因为它不可重复。 – 2012-07-09 18:24:44
他们如何验证密码一旦哈希?另外'mt_rand'将int作为参数,而不是字符串。 – 2012-07-09 18:17:21
啊,@火箭什么问题?? !!! – Engineer 2012-07-09 18:19:43
我个人使用[phpass](http://www.openwall.com/phpass/)。 – 2012-07-09 18:22:35