安全性
彩虹表
彩虹表(Rainbow Table)是一种破解密码哈希的高效数据结构和技术方法,主要用于恢复由有限字符集组成的固定长度密码的明文。是一种预先计算好的、庞大的密码对集合(明文密码及其对应的哈希值),存储为一个数据库,用于快速破解哈希值,找回原始密码。
工作原理
预计算:通过将可能的密码组合(通常是所有可能的字母数字组合)进行哈希计算,然后组织成一种特殊的数据结构,以减少存储需求和查询时间。 链式规则:不同于简单的哈希表,彩虹表中的记录通过一系列的哈希函数链接起来,形成“链条”,从而大幅度减少了所需存储空间。
查询过程:当给定一个哈希值时,通过遍历彩虹表中的链条,尝试找到与之匹配的明文密码。如果构建得当,这一过程比直接暴力破解或使用简单哈希查找表要高效得多。
优缺点
优点:极大地减少了存储空间需求,破解速度相比暴力破解快很多。
缺点:构建成本高(包括计算资源和时间),并且对于加盐(Salt)的哈希值破解效果不佳,因为每个用户的盐值不同,会使得彩虹表需要针对每个盐值单独构建,极大增加了表的大小和复杂度。
防范措施
使用加盐的哈希函数(如bcrypt, scrypt等)可以有效抵御彩虹表攻击,因为它们确保即使是相同的密码,每次哈希的结果也不同,从而大大降低了彩虹表的实用性。
彩虹表是密码安全领域中一个重要的概念,理解其工作原理有助于设计更加安全的密码存储方案。上面讲到了,如果只拿到MD5,从MD5反推明文口令,只能使用暴力穷举的方法。
然而黑客并不笨,暴力穷举会消耗大量的算力和时间。但是,如果有一个预先计算好的常用口令和它们的MD5的对照表:
| 常用口令 | MD5 |
|---|---|
| hello123 | f30aa7a662c728b7407c54ae6bfd27d1 |
如果用户使用了常用口令,黑客从MD5一下就能反查到原始口令。我们可以采取措施来抵御彩虹表攻击,方法是对每个口令额外添加随机数,这个方法称之为加盐(salt)
改进后的对照表:
| username | salt | password |
|---|---|---|
| bob | H1r0a | a5022319ff4c56955e22a74abcc2c210 |
加盐的目的在于使黑客的彩虹表失效,即使用户使用常用口令,也无法从MD5反推原始口令。