使用 md5 保护更加困难 [重复]
Posted
技术标签:
【中文标题】使用 md5 保护更加困难 [重复]【英文标题】:Using md5 secured even its more difficult [duplicate] 【发布时间】:2012-07-09 04:29:42 【问题描述】:可能重复:Secure hash and salt for php passwords
我看到有人像这样编写密码哈希,
md5(uniqid(mt_rand('password', 15), true));
这是一种安全的方法吗?这还成功了吗?
【问题讨论】:
密码经过哈希处理后如何验证?同样mt_rand
将整数作为其参数,而不是字符串。
啊,@Rocket 什么问题??!!!
我个人使用phpass。
@itsme 这就是你开始做错的地方。您尚未启用错误报告。
看看crackstation.net/hashing-security.htm,你可能会觉得很有趣。
【参考方案1】:
这不仅不安全,甚至不起作用。
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:问题是:你以后如何验证密码?稍后您需要能够生成相同的哈希,而uniqid
则无法做到这一点。 uniqid
不是用于密码,而是用于生成唯一 ID(如 UUID)。
为什么是-1?这个答案有什么问题?
我也有同样的问题,我的问题有什么问题吗?但我根本没有投反对票,我通常投赞成票。【参考方案2】:
不,这不是一种安全的方式。它是可破解的,在您的示例中,它是不可重复的。您必须将随机值与散列本身一起存储。如果 th DB 被破坏,那么暴力破解哈希变得非常简单。
您应该知道 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 ,嗯,是的,因为它不可重复。【参考方案3】:说实话,我什至不会使用 md5 作为存储密码的散列算法。我会考虑使用类似 bcrypt 的东西。另外我什至不明白你的例子是如何工作的,但无论如何,如果你想保护它,那么至少远离 md5,sha1 并从其他错误中吸取教训并使用盐。
【讨论】:
我认为如果你使用好的盐,md5 可以是安全的,但我同意更新的算法是要走的路。 @Rocket 如果您使用 md5() 只是用盐对密码进行哈希处理,这是不安全的 MD5 已经在性能方面进行了超级优化,因此在某些情况下,暴力破解它仍然是可行的,但我仍然不推荐使用 MD5 来安全地实现密码散列。 @Rocket:出于正确的原因,您不正确。对于输入未知的密码用法,md5
未已损坏。当前针对md5
的所有攻击都需要了解原始输入才能利用。但是,您是不正确的,因为没有hash(pass + salt)
是安全的,即使使用sha512
。问题是哈希太快了。检查this answer。使用高成本派生算法(例如 PBKDF2 或 BCrypt)。
@ircmaxell:啊,我明白了。似乎md5
是为速度而非安全性而构建的。我对安全/密码学知之甚少,所以我想我不知道我在说什么。谢谢你的链接。以上是关于使用 md5 保护更加困难 [重复]的主要内容,如果未能解决你的问题,请参考以下文章