以哈希值形式存储在数据库中的密码可以通过暴力计算哈希值或使用彩虹表(针对所使用的算法)进行恢复。
彩虹表是由一系列预先计算好的值组成的,这些值可以是一个字典文件,也可以是一个给定的字符集的每个组合[a-z, A-Z, 0-9]是一个常见的例子。
从本质上讲,他们可以通过允许在表中查找哈希值来加快密码的破解,而不是要求攻击者为每个密码创建哈希值。常见的密码算法(如NTLM、MD5等)的彩虹表可以在网上找到,因此可以很直接地获得大量的密码。
有许多方法可以提高存储在数据库中的哈希值的安全性。
首先是使用每个用户的盐值,这个值与散列的密码一起存储在数据库中。 它不是用来保密的,而是用来减缓蛮力过程,并使彩虹表的使用变得不切实际。
我见过的另一个附加功能是加入所谓的胡椒值。 这只是另一个随机字符串,但对所有用户都是一样的,并与应用程序代码一起存储,而不是在数据库中。这里的理论是,在某些情况下,数据库可能被破坏,但应用程序代码没有,在这些情况下,这可以提高安全性。 然而,如果有多个应用程序使用同一个密码数据库,这的确会带来问题。
第三种帮助提高密码安全性的方法是使用慢速密码功能,这对个人用户不会有很大的影响,但会大大降低攻击者破解从数据库中获取的密码的速度。关于这种方法的更多信息,请看这里 。