跳转至

安全性

彩虹表

彩虹表(Rainbow Table)是一种破解密码哈希的高效数据结构和技术方法,主要用于恢复由有限字符集组成的固定长度密码的明文。是一种预先计算好的、庞大的密码对集合(明文密码及其对应的哈希值),存储为一个数据库,用于快速破解哈希值,找回原始密码。

工作原理

预计算:通过将可能的密码组合(通常是所有可能的字母数字组合)进行哈希计算,然后组织成一种特殊的数据结构,以减少存储需求和查询时间。 链式规则:不同于简单的哈希表,彩虹表中的记录通过一系列的哈希函数链接起来,形成“链条”,从而大幅度减少了所需存储空间。

查询过程:当给定一个哈希值时,通过遍历彩虹表中的链条,尝试找到与之匹配的明文密码。如果构建得当,这一过程比直接暴力破解或使用简单哈希查找表要高效得多。

优缺点

优点:极大地减少了存储空间需求,破解速度相比暴力破解快很多。

缺点:构建成本高(包括计算资源和时间),并且对于加盐(Salt)的哈希值破解效果不佳,因为每个用户的盐值不同,会使得彩虹表需要针对每个盐值单独构建,极大增加了表的大小和复杂度。

防范措施

使用加盐的哈希函数(如bcrypt, scrypt等)可以有效抵御彩虹表攻击,因为它们确保即使是相同的密码,每次哈希的结果也不同,从而大大降低了彩虹表的实用性。

彩虹表是密码安全领域中一个重要的概念,理解其工作原理有助于设计更加安全的密码存储方案。上面讲到了,如果只拿到MD5,从MD5反推明文口令,只能使用暴力穷举的方法。

然而黑客并不笨,暴力穷举会消耗大量的算力和时间。但是,如果有一个预先计算好的常用口令和它们的MD5的对照表:

常用口令 MD5
hello123 f30aa7a662c728b7407c54ae6bfd27d1

如果用户使用了常用口令,黑客从MD5一下就能反查到原始口令。我们可以采取措施来抵御彩虹表攻击,方法是对每个口令额外添加随机数,这个方法称之为加盐(salt)

digest = md5(salt+inputPassword)

改进后的对照表:

username salt password
bob H1r0a a5022319ff4c56955e22a74abcc2c210

加盐的目的在于使黑客的彩虹表失效,即使用户使用常用口令,也无法从MD5反推原始口令。