如果存储在数据库中,使用salt如何使密码更安全?

时间:2010-10-23 20:05:47

标签: encryption passwords cryptography salt

目前我正在学习Rails,但答案不一定是Rails特定的。

因此,据我所知,安全密码系统的工作原理如下:

  • 用户创建密码
  • 系统使用加密算法(例如SHA2)加密密码。
  • 将加密密码的哈希值存储在数据库中。

登录尝试后:

  • 用户尝试登录
  • 系统使用相同的加密算法创建尝试哈希
  • 系统将尝试的哈希与数据库中的密码哈希进行比较。
  • 如果匹配,他们会被允许进入。如果没有,他们必须再试一次。

据我所知,这种方法受到彩虹攻击 - 其中可能发生以下情况。

攻击者可以编写一个基本上尝试每个字符,数字和符号排列的脚本,使用相同的加密算法创建一个哈希值,并将它们与数据库中的哈希值进行比较。

所以围绕它的方法是将哈希与唯一的盐结合起来。在许多情况下,用户注册的当前日期和时间(低至毫秒)。

但是,这个盐存储在数据库列'salt'中。

所以我的问题是,这是如何改变以下事实:如果攻击者首先访问数据库并且为“真实”密码创建了哈希并且还具有盐的哈希值,那么这是怎么回事?不只是受到彩虹袭击?因为,理论上他会尝试每个排列+盐哈希,并将结果与​​密码哈希进行比较。可能需要更长的时间,但我不知道它是多么万无一失。

原谅我的无知,我只是在学习这些东西,这对我来说从来没有多大意义。

4 个答案:

答案 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)

攻击者无法进行彩虹表攻击,并且必须使用效率低得多的暴力攻击。