从hash算法到scrypt算法的不可逆加密算法

算法

当下不可逆的加密算法主要有以下几种:

  1. 一次MD5/SHA的hash算法

  2. salt hash算法

  3. 对经过一次hash处理的密码加入salt进行再一次hash处理

  4. PBKDF2算法

  5. bcrypt算法

  6. scrypt算法

这其中最常见的就是利用hash算法进行加密,这里大多采用MD5或者SHA256作为hash函数的算法。我们利用hash算法的不可逆性,使得敌手在侵入数据库后无法获得真实密码。

但是经过hash处理后的密码依然未必安全,常见的有字典破解以及暴力破解,但是由于上述方法算法复杂度过大,当下大多选择更高效的查表法进行处理——包括逆向查表以及彩虹表法。

基于上述问题,我们考虑salt hash作为解决方案。salt是一个随机生成的长字符串,我们将salt与原始密码连接,对连接后的字符串加密,由于salt的随机性,解决了查表法带来的问题。

对与算法3,经过一次hash处理的密码加入salt进行再一次hash处理结合了算法1,2,使得破解难度更大的提升。

PBKDF2算法是将salted hash进行多次重复计算,其中次数是可定义的。我们对此机密算法的时间复杂度进行量化,如果计算一次所需要的时间是1微秒,那么计算1百万次就需要1秒钟。假如攻击一个密码所需的rainbow table有1千万条,建立所对应的rainbow
table所需要的时间就是115天,这显然是一个攻击方不可接受的时间区域。

bcrypt算法是基于Blowfish加密算法改进得到,只用于密码存储,其好处通过设定一个参数work
factor调整计算强度,同时work factor是包括在输出的摘要中的。随着攻击者计算能力的提高,使用者可以逐步增大work factor,而且不会影响已有用户的登陆,一般认为它比PBKDF2更能承受随着计算能力加强而带来的风险。bcrypt也有广泛的函数库支持,因此我们建议使用这种方式存储密码。

scrypt算法所需计算时间长,而且占用的内存也多,使得并行计算多个摘要异常困难,因此利用rainbow table进行暴力攻击更加困难,其安全性应高于PBKDF2和bcrypt。。但是相比上述算法,scrypt没有在生产环境中大规模应用,并且缺乏仔细的审察和广泛的函数库支持。在memory
hard hash中,scrypt作为使用的拉伸算法,有效的计算每个内存访问是取决于前一个实例的。

关于上述算法的代码实现,可以参考下述博客:

http://www.cnblogs.com/interdrp/p/4935819.html

发表评论