目前我正在学习Rails,但答案不一定是Rails特定的。
因此,据我所知,安全密码系统的工作原理如下:
登录尝试后:
据我所知,这种方法受到彩虹攻击 - 其中可能发生以下情况。
攻击者可以编写一个基本上尝试每个字符,数字和符号排列的脚本,使用相同的加密算法创建一个哈希值,并将它们与数据库中的哈希值进行比较。
所以围绕它的方法是将哈希与唯一的盐结合起来。在许多情况下,用户注册的当前日期和时间(低至毫秒)。
但是,这个盐存储在数据库列'salt'中。
所以我的问题是,这是如何改变以下事实:如果攻击者首先访问数据库并且为“真实”密码创建了哈希并且还具有盐的哈希值,那么这是怎么回事?不只是受到彩虹袭击?因为,理论上他会尝试每个排列+盐哈希,并将结果与密码哈希进行比较。可能需要更长的时间,但我不知道它是多么万无一失。
原谅我的无知,我只是在学习这些东西,这对我来说从来没有多大意义。
答案 0 :(得分:8)
盐(随机选择)的主要优点是即使两个人使用相同的密码,哈希也会有所不同,因为盐会有所不同。这意味着攻击者无法预先计算公共密码的哈希值,因为盐值太多了。
请注意,盐不必保密;它必须足够大(比如说64位)并且足够随机,以至于使用相同密码的两个人使用相同的盐的机会也很小。 (如果你愿意的话,你可以检查盐是否是唯一的。)
答案 1 :(得分:8)
首先,你所描述的不是彩虹攻击,而是字典攻击。
其次,使用盐的主要原因是它只会让攻击者的生活变得更加困难。例如,如果向每个密码短语添加32位盐,则攻击者必须对字典中的每个输入进行哈希并重新哈希大约40亿次,并存储来自所有的结果。那些成功的攻击。</ p>
为了有任何有效的希望,字典需要包含一百万个输入(以及一百万个匹配结果)。你提到过SHA-1,所以让我们用它作为例子。它产生一个20字节(160位)的结果。我们猜测平均输入是8个字符长。这意味着字典需要像28兆字节。但是,使用32位盐,生成字典的大小和时间都会乘以2 32 -1。
就像极粗略近似一样,假设生成一个(无盐)字典花了一个小时。使用32位盐进行相同操作需要2个 32 -1小时,这可以使用大约15年。没有多少人愿意花费这么多时间进行攻击。
既然你提到彩虹表,我会补充一点,它们通常更大,更慢。一个典型的彩虹表可以很容易地填充DVD,并将其乘以2 32 -1得到足够大的数字,存储也成为一个严重的问题(因为,这比内置的所有存储都要多)计算机的整个历史,至少在地球上。)
答案 2 :(得分:2)
查看此问题的已接受答案; Where do you store your salt strings?
它解释了哈希是如何阻止彩虹攻击的。
答案 3 :(得分:1)
攻击者无法进行彩虹表攻击,并且必须使用效率低得多的暴力攻击。