跳转到主要内容

彩虹表

本文约需 2 分钟阅读

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

决定泄露后损害程度的是存储方式

哈希值本身的泄露并不包含明文密码。但如果密码是用快速哈希函数且未加盐保存的,仅凭与预先计算好的表进行比对,就能在短时间内把大量哈希还原为明文。也就是说,即便泄露这一事实相同,由此产生的实际损害规模也早已由存储方式的选择所决定。而且,在泄露之后再修正存储方式,对已经流出到外部的哈希值并不起作用。能够重新生成哈希的只有留在自己手中的数据库,攻击者手中的副本仍是旧方式。因此,密码的存储方式是在无法阻止入侵时决定损害上限的一层,属于无法用事后应对来弥补的部分。就这一点而言,它与入侵检测或信息公开机制这类事后发挥作用的手段,角色并不相同。

彩虹表的原理

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

彩虹表的原理与数值示例

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

针对彩虹表的对策

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

用户侧的防御

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

相关术语

这篇文章对您有帮助吗?