我知道salt会将相同的密码哈希值设置为不同的值。但是,盐通常使用密码存储在数据库中。所以,让我说我是攻击者,这里是我如何使用字典攻击盐(注意在这个例子中我不写出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)
}
据我所知,这可以防止黑客使用彩虹表......但似乎并没有阻止字典攻击。我想你可以在哈希算法中加入其他东西,但是考虑到安全性,我们必须假设攻击方法是已知的。
所以看来salting可以防止黑客搞清楚哪些密码可能是字典密码(多个用户拥有的密码)并防止彩虹攻击......但不会阻止字典攻击。
这是正确的分析吗?有关更好安全性的建议吗?
谢谢!
答案 0 :(得分:10)
Salt不会阻止字典攻击,只会预先计算字典攻击。特别是,它可以防止彩虹表(http://en.wikipedia.org/wiki/Rainbow_table),并确保破解一个用户的密码不会自动破解任何共享该密码的用户。
我提到的文章中提到了一些改善腌制的方法,包括加强关键强化(http://en.wikipedia.org/wiki/Key_strengthening)。
答案 1 :(得分:4)
没有任何东西可以阻止攻击者猜测密码。
Salts通过强迫攻击者在每个用户(有效地,每个盐)的基础上散列字典来使其变得更难。
为了提高安全性,可调谐哈希函数是您最好的选择。每次打哈乱时间,使得字典攻击在攻击者可能拥有的任何硬件上都不切实际。
基本上,read this。
答案 2 :(得分:1)
答案 3 :(得分:1)
如果没有盐,攻击者可以为其词典中的每个单词生成哈希值,然后针对您的密码列表运行新词典
使用salt,每个密码都使用随机字符串进行哈希处理,因此即使使用先前的哈希字典知识,他仍然需要为数据库中的每个不同的盐重新创建一个包含盐的新哈希字典。
只需将dictionnaries表视为彩虹表的子集(小部分)。虽然彩虹表可以包含数十亿个条目,但是字典包含“已知单词”,因此最多可能有几百万个条目。
彩虹表对盐失败的原因是因为重新创建过程将是“数十亿条目”的重新计算,而字典攻击仍然是“数百万条目”。盐只会阻止预先计算的值
答案 4 :(得分:0)
你的逻辑是合理的,但实际上,如果有足够的计算能力和时间,就没有针对字典/暴力攻击的保护。