我不太明白盐对密码的作用。据我所知,它的主要用途是阻止彩虹桌的攻击。然而,我所看到的实现这一点的方法似乎并没有真正使问题变得更难。
我看过很多教程,建议盐可以这样使用:
$hash = md5($salt.$password)
原因是哈希现在映射的不是原来的密码,而是密码和盐的组合。但是输入$salt=foo和$password=bar和$hash=3858f62230ac3c915f300c664312c63f。现在有一张彩虹表的人可以反向哈希,得到输入“foobar”。然后他们可以尝试所有的密码组合(f, fo, foo,…)Oobar, obar, bar, ar)获取密码可能还需要几毫秒的时间,但仅此而已。
我看到的另一种用法是在我的linux系统上。在/etc/shadow中,散列密码实际上与salt一起存储。例如,salt为“foo”,password为“bar”将哈希为$1$foo$te5SBM.7C25fFDu6bIRbX1。如果黑客以某种方式获得了这个文件,我不知道盐有什么用途,因为te5SBM的反向哈希。已知7C25fFDu6bIRbX包含“foo”。
感谢大家对这件事的解释。
编辑:谢谢你的帮助。总结一下我的理解,salt使散列密码更加复杂,从而使它不太可能存在于预先计算的彩虹表中。我之前误解的是,我假设所有哈希表都存在一个彩虹表。
又是一个很好的问题,有很多非常周到的答案——+1到SO!
我没有看到明确提到的一点是,通过向每个密码添加随机盐,实际上可以保证碰巧选择相同密码的两个用户将产生不同的哈希值。
为什么这很重要?
想象一下美国西北部一家大型软件公司的密码数据库。假设它包含30,000个条目,其中500个的密码为蓝屏。进一步假设,黑客设法获得了该密码,比如从用户发给it部门的电子邮件中读取该密码。如果密码是未加盐的,黑客可以在数据库中找到散列值,然后简单地对其进行模式匹配,以获得其他499个帐户的访问权。
加密密码可以确保500个帐户中的每个帐户都有唯一的(salt+密码),为每个帐户生成不同的散列,从而将漏洞减少到单个帐户。让我们希望(尽管可能性不大),任何天真到在电子邮件消息中编写明文密码的用户都无法访问下一个操作系统的未记录的API。
我正在寻找一个好的方法来应用盐,发现这篇优秀的文章与示例代码:
http://crackstation.net/hashing-security.htm
作者建议对每个用户使用随机salt,这样访问salt就不会使整个哈希列表容易被破解。
To Store a Password:
Generate a long random salt using a CSPRNG.
Prepend the salt to the password and hash it with a standard
cryptographic hash function such as SHA256.
Save both the salt and the hash in the user's database record.
To Validate a Password :
Retrieve the user's salt and hash from the database.
Prepend the salt to the given password and hash it using the same hash function.
Compare the hash of the given password with the hash from the database. If they
match, the password is correct. Otherwise, the password is incorrect.