php - 使用密码作为盐的 md5 散列?

标签 php hash md5

md5($password.md5($password))

这对密码散列来说足够好了吗?我并不是要将其与 bcrypt 之类的东西进行比较。

如果不安全,请告诉我原因。

最佳答案

为每个用户的密码使用不同盐分的原因是,攻击者无法获取所有哈希密码的列表,并查看其中是否有任何与“密码”或“12345”等简单内容的哈希相匹配.如果您将密码本身用作盐,则攻击者可以计算 md5("12345".md5("12345")) 并查看它是否与任何条目匹配。

据我了解,您可以在密码表上使用四种级别的散列:

  1. - 将密码存储为纯文本。如果有人获得了您的数据库的副本,他们就可以访问所有帐户。纯文本不好,'mkay?
  2. 哈希密码 - 存储密码的哈希值,并丢弃真实密码。如果有人获得了您的数据库的副本,他们将看不到任何密码,只能看到散列。 但是,如果任何用户使用了弱密码,那么他们的哈希值将出现在彩虹表中。例如,如果用户的密码为“password”,则存储在数据库中的 md5 散列将为“5f4dcc3b5aa765d61d8327deb882cf99”。如果我在像 the one at gromweb.com 这样的彩虹表中查找该哈希,它会吐出“密码”。
  3. 使用加盐值 - 选择一个较大的随机字符串,例如 GUID,并将其存储在您的配置文件中。在计算哈希之前将该字符串附加到每个密码。现在彩虹表不太可能工作,因为它可能没有“password59fJepLkm6Gu5dDV”或“picard59fJepLkm6Gu5dDV”的条目。尽管预先计算的彩虹表不再那么有效,但如果攻击者知道您的盐值,您仍然容易受到影响。攻击者可以计算弱密码的哈希值加上您的盐值,然后查看您数据库中的任何用户是否使用该弱密码。如果您有几千个用户,那么每次哈希计算都会让攻击者进行数千次比较。您实际如何使用盐可能取决于您使用的加密算法。为简单起见,将其想象为将盐和密码附加在一起。
  4. 使用不同的 salt 值 - 现在您可以使用不同的东西,例如用户名、电子邮件地址,甚至用户 ID,并将其与密码和配置中的大随机字符串结合起来计算哈希之前的文件。现在,知道您的 salt 的攻击者仍然需要为每个用户重新计算哈希值,以查看他们是否使用了像“password”这样的弱密码。

有关更多详细信息,请查看 Coding Horror 帖子“You're probably storing passwords incorrectly”。

关于php - 使用密码作为盐的 md5 散列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5482437/

相关文章:

php - PHP 和 VB.NET 之间的意外 MD5 哈希结果

c# - 是否可以复制 .NET HashAlgorithm(用于重复的增量哈希结果)?

c# - 在 C# 中计算图像的 MD5 校验和

php - PHP 和 MySQL 中 undefined variable 索引

c++ - 为什么在使用 'CryptSetHashParam' 之后,我不能再向我的 MD5 哈希对象添加数据?

php - 帮助进行 MySQL 查询

javascript - 用于 React Native/JS 的 SHA256 ComputeHash(来自 C#)的等效版本

java - HashMap 在对象发生变化时自动更新

随机排序的PHP MySQL分页

php - 在 PHP 中分析不仅仅是函数调用