13

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

因此,据我了解,安全密码系统的工作方式如下:

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

登录尝试时:

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

据我了解,这种方法会受到彩虹攻击——可能会发生以下情况。

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

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

但是,此盐存储在数据库列“盐”中。

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

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

4

3 回答 3

8

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

请注意,盐不必保密;它只需要足够大(例如 64 位)和足够随机,以使使用相同密码的两个人也使用相同的盐的机会微乎其微。(如果您愿意,可以检查盐是否是唯一的。)

于 2010-10-23T20:09:23.677 回答
8

首先,您描述的不是彩虹攻击,而是字典攻击。

其次,使用盐的主要目的是让攻击者的生活更加困难。例如,如果您为每个密码短语添加 32 位盐,攻击者必须对字典中的每个输入进行哈希和重新哈希约 40 亿次,并存储所有这些结果的结果才能成功攻击。

为了有任何有效的希望,字典需要包含类似一百万个输入(和一百万个匹配结果)之类的东西。您提到了 SHA-1,所以让我们在示例中使用它。它产生一个 20 字节(160 位)的结果。让我们猜测一个平均输入大约是 8 个字符长。这意味着字典需要大约 28 兆字节。然而,使用 32 位盐,生成字典的大小和时间都会乘以 2 32 -1。

就像一个非常粗略的近似值一样,假设制作一本(未加盐的)字典需要一个小时。使用 32 位盐执行相同操作需要 2 32 -1 小时,大约需要 15 年。没有多少人愿意在攻击上花费这么多时间。

既然你提到了彩虹表,我要补充一点,它们通常更大,开始时更慢。一个典型的彩虹表很容易填满一张 DVD,将其乘以 2 32 -1 得到足够大的数字,存储也成为一个严重的问题(例如,这比整个计算机历史中构建的所有存储都多,在地球上最少)。

于 2010-10-23T20:31:35.980 回答
1

攻击者无法进行彩虹表攻击,必须进行暴力破解,效率要低得多。

于 2010-10-23T20:09:44.757 回答