为什么要对密码加密
有一些不负责任的WEB应用,数据库中的密码是使用明文存储的,一旦数据库泄露,就会造成很严重的后果,由于绝大多数用户在多个不同平台的账号密码往往是相同的,黑客就会利用在数据库中获取的账号和明文密码,去访问各大平台,这会造成连带的后果,十分危险。
CSDN 就是这样的典型案例。非常不幸的是,存明文密码的网站不在少数,而且不少是很多所谓的有公信力的大网站。
什么是彩虹表
对于不可逆的加密,最简单的破解就是构造一个巨大的彩虹表(rainbow table)
简单说就是穷举可能的密码组合,比如遍历所有9位数字,从10000,0000到99999,9999
将每个数字的md5 hash散列存入数据库。
然后当用户查询某个加密后的字符串md5 hash时,就去这个数据库里查询挨个比对,如果能查到,就可以反推出原字符串是多少。如果查不出来,也只能说明这个rainbow table不够大,没有包含用户的密码,本质上这就是一种暴力攻击brute force attack
盐Salt
一般来说,最简单的提升加密强度的方法就是“加盐”,也就是所谓的salt。这样的话,能极大提升攻击成本,因为对于每位用户的密码,都加了不同的salt,这样你每破解一个用户的密码,都需要重建一次彩虹表。时间成本及其巨大。
常用的加密算法
MD5
由于彩虹表的存在,MD5加密也变得不再安全
SHA1
同上
Bcrypt
1 | @Testvoid contextLoads() { |
从上述代码可以看出,每一次加盐都是随机的,而且同一个密码理论上可以对应无数种结果,这使得暴力方法变得不可取。当然,在当前计算机的计算水平是很难完成的,量子计算出现以后,暴力方法会变得很简单。
如何进行相对安全的加密
推荐利用:hash+随机salt+自己算法,这种杂揉的方式。