盐是伪随机的,但实际上基于密码(我认为这很糟糕?)。
哈希函数还会在哈希字符串中伪随机地“撒”盐。
哈希检查函数会反转盐撒法,然后进行实际的哈希检查。
现在,我知道每个密码哈希的唯一盐值很好,但是将哈希密码和创建盐值的逻辑存储在数据库函数中可能不好。
我喜欢盐不明显的想法,它也不需要基于某些希望一致的值,比如用户名、用户ID、出生日期等,但是我对实现有所怀疑。
那么,人们对“最佳方法解决方案”的意见和想法是什么呢?
从密码中派生盐完全没有意义。
盐的目的是为了使使用彩虹表变得非常昂贵,因此“尝试1”基本上正确地解决了这个问题。将盐基于密码消除了打败彩虹表的可变性,尝试隐藏它在哈希密码字段中就毫无意义。
我之前问过一个类似的问题。共识是:
重要的不是你如何加盐,而是你:
你甚至可以将你的盐存储在与哈希密码相邻的位置,并且感觉十分自信。
个人而言,我发现GUID(以字符串格式)非常适合作为盐。只需要一行代码即可生成,在字符串格式中足够大,使得彩虹表需要数千年才能计算出。
(由于我最初误读了文章并认为他只是将盐混合在一个无盐哈希中,因此编辑了回答)
他的技术看起来还不错,它们会起作用,但它们并没有比普通的加盐方法更好。这只是试图通过混淆保障安全性,它不比编写自己的随机“哈希混淆”方法然后希望攻击者无法找出更好。
实际上,在许多情况下,攻击者可能很容易找出这些函数。如果该站点是一个公开注册的站点,攻击者可以反复注册带有已知密码的帐户,然后使用这些密码的已知 MD5 哈希值来逆推密码混淆算法。我甚至可以轻松地完成这个过程,即使是看着他“尝试 4”的结果。
如果您想真正安全地存储密码,请避免使用MD5甚至SHA1,并转向盐值较高、速度较慢的哈希函数。这是一篇关于该主题的好文章:Enough With The Rainbow Tables: What You Need To Know About Secure Password Schemes
我无法查看原问题中的链接(该网站返回404未找到错误),但问题描述中所述的方法实际上并没有使用盐散列。
本质上,这种方法只是使用了非标准哈希:给定一个特定的密码,将存储在数据库中的是唯一的值。这就足以使彩虹表攻击生效:我可以预先计算出一个可能的密码字典的哈希值并寻找任何匹配项。现在,我必须专门为这种非标准哈希函数预先计算彩虹表。
在正确实现盐散列的情况下,创建密码时将随机盐与密码组合并进行哈希处理。然后使用随机盐和哈希进行存储。即使我知道密码,我也无法预测哈希会是什么,因为每个可能的盐值都有不同的哈希值。现在,攻击者需要为每个可能的盐值预先计算彩虹表:这需要投入更大的精力。