使用密码作为salt的md5哈希?

wii*_*man 11 php hash md5

md5($password.md5($password))
Run Code Online (Sandbox Code Playgroud)

密码哈希是否足够好?我不是要求将它与bcrypt这样的东西进行比较.

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

Don*_*kby 33

为每个用户的密码使用不同的盐的原因是攻击者无法获取所有散列密码的列​​表,并查看它们中的任何一个是否与"password"或"12345"之类的哈希相匹配.如果您使用密码本身作为salt,则攻击者可以计算md5("12345".md5("12345"))并查看它是否与任何条目匹配.

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

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

有关更多详细信息,请查看编码恐怖帖子," 您可能错误地存储密码 ".

  • @Col:你应该对你的密码进行加密,它应该是一个以明文或散列值的一部分存储的独特值.不确定你的问题在这里. (3认同)

Mat*_*Mat 2

它对字典攻击没有多大作用,计算字典的难度只是单个字典的两倍md5,而且md5现在相当便宜。

  • 并不真地。使用固定盐或您的方法计算字典并不困难。同样的复杂性。 (2认同)