使用 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),然后返回015 之间的随机数。

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 保护更加困难 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

客户端密码加密[重复]

客户端密码加密[重复]

Django 上传:丢弃上传的重复文件,使用现有文件(基于 md5 的检查)

linux 通过md5查找重复文件

使用分布式锁时考虑哪些问题

PHP MD5(MD5)散列[重复]