我正在阅读一些关于盐和密码哈希的文章,一些人提到了彩虹攻击。彩虹攻击到底是什么,防止它的最佳方法是什么?
7 回答
维基百科的文章有点难以理解。简而言之,您可以将 Rainbow Table 视为一个大字典,其中包含预先计算的哈希值和计算它们的密码。
Rainbow Tables 与其他字典的区别仅在于条目的存储方式。Rainbow 表针对哈希和密码进行了优化,因此在保持良好查找速度的同时实现了极大的空间优化。但本质上,它只是一本字典。
当攻击者从您那里窃取一长串密码哈希时,他可以快速检查其中是否在彩虹表中。对于那些,Rainbow Table 也将包含它们是从哪个字符串进行哈希处理的。
当然,有太多的哈希值无法将它们全部存储在彩虹表中。因此,如果哈希不在特定表中,那么黑客就不走运了。但是,如果您的用户使用简单的英文单词并且您只对它们进行了一次哈希处理,那么好的 Rainbow Table 很可能会包含密码。
当有人使用Rainbow 表来破解密码时。
如果你担心这个,你应该使用Salt。还有一个Stack Overlow 问题可以帮助您比维基百科更好地理解盐......
对于外行来说,这是一篇关于彩虹桌的有用文章。(不是说你是外行,但写得很好,简洁。)
从广义上讲,您对大量可能的短明文字符串(即密码)进行加密,并将加密值与明文一起存储。这使得在您拥有加密值时简单地查找明文变得(相对)简单。
这对于弱和/或未加盐的密码哈希最有用。一个流行的例子是LAN Manager hash,Windows 到 XP 的版本都使用它来存储用户密码。
请注意,即使像 LM 哈希这样简单的东西,预先计算的彩虹表也需要大量的 CPU 时间来生成并占用相当多的空间(大约 10 千兆字节的 IIRC)。
Rainbow Tables 基本上允许某人切实可行地存储大量预先计算的哈希值。
这使得破解您的散列密码变得容易,因为不是执行一整堆散列函数,工作已经完成,他们实际上只需要进行数据库查找。
针对这种攻击的最佳保护措施是在密码中使用盐(随机字符)。即不是存储md5(密码),而是存储md5(密码+盐),甚至更好的md5(盐+ md5(密码))。
因为即使使用彩虹表,也几乎不可能存储所有可能的加盐哈希。
顺便说一句,显然您必须将您的盐与您的哈希一起存储,以便您可以对用户进行身份验证。
聚会迟到了,但我也知道 Rainbow Tables 是一种攻击散列/未加盐密码的方法。然而,最近在 Twitter 上分享了http://codahale.com/how-to-safely-store-a-password/,这取决于您的需求和顾虑。您可能无法通过自己的方式来安全密码存储。
我希望这对您有所帮助。
维基百科是你的朋友: