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

mar*_*ion 13 encryption passwords cryptography salt

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

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

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

登录尝试后:

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

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

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

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

但是,此salt存储在数据库列'salt'中.

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

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

Jon*_*ler 8

盐(随机选择)的主要优点是即使两个人使用相同的密码,哈希也会有所不同,因为盐会有所不同.这意味着攻击者无法预先计算公共密码的哈希值,因为有太多不同的盐值.

请注意,盐不必保密; 它必须足够大(比如说64位)并且足够随机,以至于使用相同密码的两个人使用相同的盐的机会也很小.(如果你愿意的话,你可以检查盐是否是唯一的.)

  • 蛮力哈希需要相当长的时间,即使它像你所暗示的一样容易,你仍然可以阻止任何没有百万计算机僵尸网络的人. (3认同)
  • 目标是使密码破解比其他攻击方法更难.如果攻击者可以读取数据库并且有足够的计算时间可以为攻击者想要的每个帐户构建一个彩虹表,那么您或者攻击者就会错误地判断进入您网站的风险/价值. (2认同)

Jer*_*fin 8

首先,你所描述的不是彩虹攻击,而是字典攻击.

其次,使用盐的主要原因是它只会让攻击者的生活变得更加困难.例如,如果向每个密码短语添加32位盐,则攻击者必须对字典中的每个输入进行哈希并重新哈希大约40亿次,并将所有这些输入的结果存储起来以成功进行攻击.

为了有任何有效的希望,字典需要包含一百万个输入(以及一百万个匹配结果).你提到过SHA-1,所以让我们用它作为例子.它产生一个20字节(160位)的结果.我们猜测平均输入是8个字符长.这意味着字典需要像28兆字节.但是,使用32位盐,生成字典的大小和时间都会乘以2 32 -1.

就像一个非常粗略的近似,让我们说生产一个(未加盐的)字典花了一个小时.使用32位盐进行相同操作需要2 32 -1小时,这可以使用大约15年.没有多少人愿意花费这么多时间来进行攻击.

既然你提到彩虹表,我会补充一点,它们通常更大,速度更慢.一个典型的彩虹表可以很容易地填充DVD,并将其乘以2 32 -1给出足够大的数字,存储也成为一个严重的问题(因为,这比整个计算机历史中构建的所有存储都要多,至少在地球上).

  • @marcamillion攻击者需要那么多的存储_per_password_,如果他们想为每个盐生成每个哈希值.当然,在实践中,由于彩虹表的工作方式,它们需要的更少,但所需的存储量仍然过高. (2认同)