密码哈希和腌制 - 这是一个很好的方法吗?

时间:2009-05-12 21:31:25

标签: mysql encryption hash passwords salt

我正在做一些研究或谷歌搜索处理密码散列和盐析的不同方法,并遇到了这个有趣的链接:

http://phix.me/salt/

现在,基本上建议的是创建两个用户函数,一个用于散列,另一个用于检查散列。

盐是伪随机的,但实际上是基于密码(让我感觉不好?)。

哈希函数也伪随机地“撒”哈希字符串中的盐。

哈希检查功能会反转盐洒,然后进行实际的哈希检查。

现在,我知道每个密码哈希的唯一salt =好,但是具有散列密码并创建存储在db函数中的salt的逻辑可能=坏。

我喜欢盐不明显的想法,也不需要基于一些有希望的一致性值,如用户名,用户ID,出生日期等,但正如我所说,我确实怀疑实施。

那么,人们对“最佳方法解决方案”的看法和想法是什么?

8 个答案:

答案 0 :(得分:14)

salt doesn't need to be secret.对于给定的密码,它确实是不可预测的。

从密码中获取盐完全忽略了这一点。

答案 1 :(得分:11)

盐的目的是使rainbow table的使用过于昂贵,因此尝试1几乎可以正确地解决问题。基于密码的盐消除了使彩虹表失败的可变性,并试图将其隐藏在散列密码字段中是没有意义的。

答案 2 :(得分:7)

我先前问similar question。共识是这样的:

只要你这样,你的盐如何:

  1. 哈希之前的盐
  2. 使用每个密码唯一的随机盐
  3. 使用足够大的盐使彩虹表格过高。
  4. 您甚至可以将盐储存在散列密码旁边,并且非常自信。

    就个人而言,我发现GU​​ID(字符串格式)对Salts非常有用。他们采用一行代码来生成,并且以字符串格式的大小足以使彩虹表花费数千年来计算。

答案 3 :(得分:4)

(编辑的答案,因为我最初误读了这篇文章,并认为他只是将盐与未加盐的哈希混合在一起)

他的技术似乎很好,他们会工作,但他们并不比普通的腌制方法“更好”。这只是一种通过默默无闻来做安全的尝试,它并不比编制你自己的随机“哈希加扰”方法更好,并希望攻击者不会弄清楚它。

事实上,在许多情况下,攻击者实际上很容易想出这些功能。如果该站点是具有公共注册的站点,则攻击者可以重复注册具有已知密码的帐户,然后使用已知的md5哈希值来对这些密码进行逆向工程以对密码加扰算法进行反向工程。即使看着他的“尝试4”的结果,我也能很容易地做到这一点。

如果您想要真正安全地存储密码,请远离MD5甚至SHA1,并转向盐渍的较慢的哈希函数。这是一篇关于该主题的精彩文章:Enough With The Rainbow Tables: What You Need To Know About Secure Password Schemes

答案 4 :(得分:4)

答案 5 :(得分:3)

对我而言,这似乎只是添加混淆不再是安全,(正如Chad Birch指出被误解的)盐渍哈希方法

答案 6 :(得分:1)

有趣的是,这不仅仅是混淆,而不是更多的安全性,但实际上是混淆,安全性较低,因为“尝试4”仅与它使用的CRC32功能一样好(CRC32只传递密码,而不是密码+盐) - 这就是垮台。

根据Chad的帖子,为了破解“尝试4”,所有人必须做的就是CRC32加载密码然后反转他编码的功能,留下盐渍的md5哈希和盐(然后你会测试为了有效性)。只需通过计算md5(密码+盐)(其中密码是您正在尝试的密码)测试该对,盐是您通过反转算法计算的盐。如果md5等于散列的前32个字符,则表示您已经破解了密码。

“尝试4”在某些方面比“尝试1”更糟糕,因为它与整个例程中调用的最差函数一样好,在本例中为CRC32(密码)。

答案 7 :(得分:1)

我无法查看原始问题中的链接(网站只返回404未找到错误),但问题中描述的方法实际上并没有使用盐渍哈希。

本质上,此方法仅使用非标准哈希:给定特定密码,有一个唯一值将存储在数据库中。这就是使彩虹表攻击工作所需的全部内容:我可以预先计算可能密码字典的哈希值并查找任何匹配项。现在,我将不得不专门为这个非标准哈希函数预先计算彩虹表。

在盐渍哈希的正确实施中,当创建密码时,随机盐与密码组合并进行哈希处理。然后存储使用的随机盐和散列。即使我知道密码,我也无法预测哈希是什么,因为对于许多可能的盐值中的每一个都会有不同的哈希值。现在攻击者需要为每个可能的盐值预先计算彩虹表:这需要更大的努力。