我正在做一些研究或谷歌搜索处理密码散列和盐析的不同方法,并遇到了这个有趣的链接:
现在,基本上建议的是创建两个用户函数,一个用于散列,另一个用于检查散列。
盐是伪随机的,但实际上是基于密码(让我感觉不好?)。
哈希函数也伪随机地“撒”哈希字符串中的盐。
哈希检查功能会反转盐洒,然后进行实际的哈希检查。
现在,我知道每个密码哈希的唯一salt =好,但是具有散列密码并创建存储在db函数中的salt的逻辑可能=坏。
我喜欢盐不明显的想法,也不需要基于一些有希望的一致性值,如用户名,用户ID,出生日期等,但正如我所说,我确实怀疑实施。
那么,人们对“最佳方法解决方案”的看法和想法是什么?
答案 0 :(得分:14)
salt doesn't need to be secret.对于给定的密码,它确实是不可预测的。
从密码中获取盐完全忽略了这一点。
答案 1 :(得分:11)
盐的目的是使rainbow table的使用过于昂贵,因此尝试1几乎可以正确地解决问题。基于密码的盐消除了使彩虹表失败的可变性,并试图将其隐藏在散列密码字段中是没有意义的。
答案 2 :(得分:7)
我先前问similar question。共识是这样的:
只要你这样,你的盐如何:
您甚至可以将盐储存在散列密码旁边,并且非常自信。
就个人而言,我发现GUID(字符串格式)对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未找到错误),但问题中描述的方法实际上并没有使用盐渍哈希。
本质上,此方法仅使用非标准哈希:给定特定密码,有一个唯一值将存储在数据库中。这就是使彩虹表攻击工作所需的全部内容:我可以预先计算可能密码字典的哈希值并查找任何匹配项。现在,我将不得不专门为这个非标准哈希函数预先计算彩虹表。
在盐渍哈希的正确实施中,当创建密码时,随机盐与密码组合并进行哈希处理。然后存储使用的随机盐和散列。即使我知道密码,我也无法预测哈希是什么,因为对于许多可能的盐值中的每一个都会有不同的哈希值。现在攻击者需要为每个可能的盐值预先计算彩虹表:这需要更大的努力。