我知道,盐使相同的密码哈希值不同。但是,盐通常与密码一起存储在数据库中。因此,假设我是攻击者,这就是我可能会如何对盐使用字典攻击(请注意,在本示例中,为了简洁起见,我不会写出128位哈希或盐):
user_pw = 'blowfish'
Given:
email = 'blah@blah.com'
hash = '1234567890'
salt = '0987654321'
function attack(){
for each(word in dictionary)
md5( word * salt ) == hash ? cracked_one(email, word)
}
我知道这可以防止黑客使用Rainbow表...但是似乎并不能阻止字典攻击。我猜您可以在哈希算法中添加其他内容,但是出于安全性考虑,我们必须假定攻击方法是已知的。
因此,盐析似乎阻止了黑客弄清楚哪些密码很可能是字典密码(多个用户拥有的密码),并防止了rainbow攻击……但并不能阻止字典攻击。
这是正确的分析吗?有什么更好的安全建议吗?
谢谢!
最佳答案
Salt不能阻止字典攻击,而只能阻止预先计算的字典攻击。特别是,它可以防止彩虹表(http://en.wikipedia.org/wiki/Rainbow_table)并确保破解一个用户的密码不会自动让您破解共享该密码的任何用户。
我链接到的文章提到了一些改进的方法,包括增强关键性(http://en.wikipedia.org/wiki/Key_strengthening)。