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

原文地址:https://blog.csdn.net/sjrgckym/article/details/78069850?from=timeline

本篇博客主要对从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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值