彩虹表(Rainbow Table)是一种预计算攻击数据结构,用大量候选密码和哈希链换取后续反查速度,常用于攻击未加盐或弱加盐的密码哈希。
核心问题
如果许多系统都使用同一个快速哈希函数保存密码,攻击者可以提前计算常见密码的哈希结果。拿到某个数据库后,不必从零开始暴力破解,只需要查表或沿链还原候选密码。
彩虹表解决的是攻击者侧的效率问题:用大量预计算和存储,换取泄露发生后的快速破解。
核心机制
简单哈希表会保存 password -> hash 的完整映射,但空间巨大。彩虹表使用“哈希函数 + 归约函数”的链式结构,只保存链的起点和终点:
- 从候选密码开始计算哈希。
- 用归约函数把哈希映射回一个新的候选密码。
- 重复多轮形成链。
- 只保存链起点和终点。
查询时,攻击者从目标哈希出发尝试不同位置的归约和哈希链,看是否能命中某条链的终点,再从起点重放链条找到原始密码。
工程用途
彩虹表本身是攻击技术;防御上理解它有助于判断密码存储方案是否合格。现代密码存储通过 salt、慢哈希、内存困难算法和成本参数,降低预计算表的复用价值。
边界与常见坑
- 彩虹表不是普通暴力破解:它把部分计算提前完成,适合攻击无 salt 或复用 salt 的哈希。
- salt 会破坏预计算复用:每条记录独立 salt 让攻击者必须为每个 salt 重新建表或重新计算。
- 慢哈希进一步提高成本:即使有 salt,普通快速哈希仍容易被按记录暴力破解。
- 泄露哈希仍然危险:salt 不是保密屏障,弱密码仍可能被字典攻击猜中。
- 不要依赖冷门哈希函数:安全性来自成熟密码哈希方案和参数,不来自“别人不知道算法”。