跳转到主要内容

彩虹表

本文约需 2 分钟阅读

彩虹表 (Rainbow Table) 是为了从哈希值反查出原始密码而预先计算好的表。事先制作大量密码及其哈希值的对应表,通过与泄露的哈希值进行比对,即可快速确定原始密码。这是一种利用时间与空间权衡的高效攻击手法,截至 2025 年,对于使用 MD5 或 SHA-1 等快速哈希的系统而言,它仍然是有效的威胁。

现场使用案例

“在调查泄露数据库的密码哈希时发现,使用的是无盐的 MD5 哈希,用彩虹表在数分钟内就还原了约 70% 的密码。迁移到 bcrypt 已迫在眉睫。”

彩虹表的原理

明文密码
哈希函数
归约函数
重复链式计算
仅保存起点与终点

彩虹表的原理与数值示例

彩虹表保存的是交替应用归约函数与哈希函数所形成的链。针对由英文小写字母 + 数字组成的 8 位密码 (约 2.8 万亿种) 的 MD5 彩虹表,约 460 GB 即可构建,破解可在数分钟内完成。另一方面,对于由英文大小写字母 + 数字 + 符号组成的 12 位密码,表的大小会膨胀到数百拍字节,实际上无法构建。也就是说,仅仅增加密码的长度和字符种类,就能使彩虹表攻击的实际效果急剧下降。密码破解相关书籍 (Amazon)中可以学习到技术上的详细内容。

针对彩虹表的对策

最有效的对策是在对密码进行哈希之前,给密码附加 (随机数据)。一旦附加了盐,即使是相同的密码,也会为每个用户生成不同的哈希值,从而使预计算表失效。在现代的密码保存中,bcrypt 和 Argon2 等能够自动附加盐并可调整计算成本的哈希算法是标准做法。服务开发者不得将 MD5 或 SHA-1 等快速哈希用于密码保存。

用户侧的防御

16 个字符以上的随机密码被包含在彩虹表中的可能性低到天文数字级别,因此对这种攻击具有很高的抵抗力。提高密码的熵,是应对一切离线攻击的最佳防御策略。密码保护相关书籍 (Amazon)也很有参考价值。

相关术语

这篇文章对您有帮助吗?

XHatena