目前我正在学习 Rails,但答案不一定是 Rails 特定的。
因此,据我了解,安全密码系统的工作方式如下:
- 用户创建密码
- 系统使用加密算法(例如 SHA2)加密密码。
- 将加密密码的哈希存储在数据库中。
登录尝试时:
- 用户尝试登录
- 系统使用相同的加密算法创建尝试哈希
- 系统将尝试的哈希值与数据库中的密码哈希值进行比较。
- 如果匹配,他们就可以进入。如果不匹配,他们必须再试一次。
据我了解,这种方法会受到彩虹攻击——可能会发生以下情况。
攻击者可以编写一个脚本,基本上尝试字符、数字和符号的每个排列,使用相同的加密算法创建一个散列,并将它们与数据库中的散列进行比较。
所以解决它的方法是将哈希与独特的盐结合起来。在许多情况下,用户注册的当前日期和时间(低至毫秒)。
但是,此盐存储在数据库列“盐”中。
所以我的问题是,这将如何改变这样一个事实,即如果攻击者首先获得了对数据库的访问权限,并且为“真实”密码创建了散列,并且还具有盐的散列,那么这怎么不仅仅是受到彩虹攻击?因为,理论上他会尝试每个排列+盐哈希并将结果与密码哈希进行比较。只是可能需要更长的时间,但我不明白它是如何万无一失的。
原谅我的无知,我只是在学习这些东西,这对我来说从来没有多大意义。