从此网站http://codahale.com/how-to-safely-store-a-password/:
重要的是要注意盐对于防止字典攻击或暴力攻击是无用的。
如果盐无法阻止字典攻击,为什么要使用盐?
答案 0 :(得分:6)
对于单个密码,它没有那么大的差别。强制使用未加密码的密码与强制使用加密密码一样困难。你只需要尝试按键,直到受到重击。
不同之处在于存在大量密码,例如在泄漏的数据库中。基本思想是在破解许多密码时可以重复使用部分必要的计算。这是通过构建彩虹表来完成的。这样做计算成本很高,但一旦完成,攻击者就可以相对快速地破解大量密码。使用彩虹表破解N
密码要快于强制执行这些N
密码。
如果每个密码都使用单个盐进行哈希处理,则无法以相同方式重复使用信息。您仍然可以构建彩虹表,但它们只能用于数据库中的一个密码,这使得它们无用。因此,为了破解N
密码,您必须单独强制使用所有N
密码,这对攻击者来说通常是不切实际的。
对于无密码密码和流行的哈希算法,您只需从Internet下载预先计算的彩虹表,因此攻击者甚至不必自己计算。他只需下载一个表并查找特定哈希的密码即可。盐阻止了这一点。
无保留哈希还有一个缺点,即具有相同密码的两个用户的密码哈希是相同的。因此,如果攻击者发现多个用户使用相同的密码哈希,他只需要破解该密码一次。
答案 1 :(得分:1)
如果'攻击者'拥有您的网站/应用使用的密码哈希(和盐),他们只会强行使用“盐”+“密码”。
但是,使用salt可以提供更多针对彩虹表(预先计算的哈希表)的保护,因此它们仍然值得使用。
答案 2 :(得分:1)
盐可防止通过彩虹表从字典中立即开裂;文章和后续文章指出CPU /存储权衡现在使得彩虹表没有意义,所以盐对你没有帮助。当然,他们从未帮助过暴力攻击。
答案 3 :(得分:1)
为了便于说明,假设您使用2个字符串作为盐,可以是集合中的随机元素
salts = {'00', '01', '02'...... '99'}
您使用的公式是:
salt = salts[rnd(100)] # gets a random element from the set above, say '87'
password_hash = MD5(password + salt) # say the hash is 'dai480hgld0'
此后,您将在数据库中保存哈希值和salt,例如
+---------------------------+ | password_hash | salt| +---------------------------+ | dai480hgld0 | 87 | | sjknigu2948 | 23 | | . | . | | . | . | +--------------------+------+
我们假设在受感染的系统中,攻击者可以访问您的代码 - 因此他知道您如何计算哈希值。
攻击者也可以访问您的数据库,因此他拥有所有密码哈希值和盐。
鉴于此信息,为了破解您的密码(具有哈希:'dai480hgld0'),他必须执行以下操作:
for word in dictionary_words #iterate over all the words in dictionary
for salt in salts #iterate over all possible salts (100 iterations)
password_hash = MD5(word + salt)
if password_hash == 'dai480hgld0'
print "The password is " + word
exit()
endif
next
next
请注意,如果您根本没有没有使用任何盐,那么算法就是
for word in dictionary_words #iterate over all the words in dictionary
password_hash = MD5(word)
if password_hash == 'dai480hgld0'
print "The password is " + word
exit()
endif
next
从上面两个代码示例中可以明显看出,在密码中添加一个盐会增加暴力攻击的尝试次数。在我们的案例中,由于有100种可能的盐,你已经让攻击者用100种盐来尝试每个单词。
所以,总结一下:
盐很好。它们使您的密码难以破解。即使您的用户输入弱密码,salt也会确保生成的哈希值不可搜索。例如,它很容易谷歌哈希'3cc31cd246149aec68079241e71e98f6'这实际上是一个相当复杂的密码,几乎可以满足所有密码策略。仍然破解它不需要一行代码!
盐不是灵丹妙药。它们只会增加破解者暴力破解密码所需的时间。但是,如果您的盐地址空间相当大,那么您就相当不错了。例如,如果你有32个字符的字母数字字符串作为盐 - 暴力将真的需要很长时间。
答案 4 :(得分:0)
Salt使加密更强大。但是,字典攻击不会尝试解密密码哈希,所以盐或没盐,没关系,他们只会尝试许多密码,直到一个工作。
答案 5 :(得分:0)
这属于security.stackexchange.com
问题在于计算容量与散列算法的速度相结合。基本上,他正在投球,这很慢。
如果黑客同时使用了散列和盐,并且知道用于散列密码的算法,那么破解它只是时间问题。
如果使用非常快的算法,则该时间非常短。如果使用极慢的算法,那么显然,找到命中的时间会更长。
这让我们首先了解为什么我们首先哈希/加盐:购买时间。可用于更改列出的所有密码的时间以及联系所有用户的时间,以便在需要更改其他系统上的密码时让他们知道。
我们使用salt的原因是强制黑客按照盐值构建彩虹表。这样,一个表不能用于破解所有密码。这样做的唯一原因是为了节省时间,并希望能够阻止普通黑客投入更多资源来破解所有这些。
无论使用何种机制,散列密码都不安全,因为大多数人都会使用该密码。安全并不意味着“永远不会破解”。相反,它意味着“在破解时间/努力方面,这将是昂贵的”。对于大多数黑客来说,他们想要的是低悬的水果,例如只有明文。对于一些人来说,他们会去任何需要的极端,例如根据盐值建造大量的彩虹表来获得它们。
当然,支持这一点的是,是否可以在用户表中轻松识别任何“超级”用户帐户。对于大多数系统来说,只破解sys admin类型的帐户就足够了,因此每个用户使用不同的salt值这一事实并不重要。聪明的人只会为这一个帐户烦恼。
答案 6 :(得分:0)
这并不完全准确,因为大多数情况都取决于你的假设。
主要假设是:
答案 7 :(得分:0)
现在这似乎不是一个编程问题,所以我只会给你一些有关盐析和加密的信息:
salting的目的是帮助Hashing这样的单向函数,Hashing在密码学中被广泛使用,由于难以猜测而经常使用密码,以及其他攻击如蛮力攻击所需的时间破解它们。
如果您想安全存储密码,最好的办法绝对是加密。在维基百科上查找加密,了解更多信息。
答案 8 :(得分:0)
两条评论:
可以迭代常规哈希算法。不需要使用非标准算法只是因为你想增加工作因素。
即使您使用慢哈希方法,也建议使用Salt。它可能不一定会增加最佳攻击的工作量,但如果用户选择的密码与另一个用户,另一个帐户或旧密码的密码相同,它将阻止琐碎的攻击。</ p>