密码加盐原理及shiro实现

看了一段时间各种资料,才算是理解密码保护中,加盐的好处及实现方式,总结如下:


1. 密码在数据库存储方式


a. 明文存储

username

pwd

liukunbendan

liukun

这种情况下,数据库如果被拖库,用户信息(核心就是用户名/密码)就直接泄露


b. 加密存储

username

pwd(sha512)

liukunbendan

(sha512 (liukun))

3afb1e6d5177393678787b96171feccf22aec73c73cf61aed015f804cba9dd2bdb16f2ad9cf8738d4a00302d747cf5861dd820989b2562bb60f97710dc6b06af

这种情况下,黑客拿到数据库后,课使用暴力穷解破解(或者使用rainbow table彩虹表 来快速匹配hash值)

rainbow table: 黑客根据常用密码/(其他被盗库的密码) 生成hash值,直接查找


c.  加密+加盐 存储

username

pwd(sha512)

salt - 系统随机产生,每个用户都不一样

liukunbendan

(sha512 (liukun) + (123))

b80500a9cae49b336e246e41ffd65ffccd95f198d95065ec814733ecc9e71b72acaaf9300fdd4f53c36bd8b4c73bffbeb39ab9a945147c4d7a0b6f04ddb37b9d

123

这种情况下,黑客需要根据 salt + 常用密码 ,来针对每个客户生成rainbow table, 工作量大了N倍 (N=客户量)


2. shiro实现

我使用的函数如下:

String passwordEncode = new SimpleHash("SHA-512","password","abc",1).toString();

该函数有4个参数: 加密方法(md5, SHA-1, SHA-256, SHA-512 等等),“密码明文”,"盐值"  hash次数

实际运行中,后台会以  hash("abc(salt)"  "password") 的方式计算得出结果

例如,上面函数结果为:

be8795e7a4b2a9d3cd0ab93cfc1d1143dc428ae3f2a8acefa0b565baecf4985a8ad6dd39b755cfad972601de596a3fdb25baf592b552a6b1968d49d3c955c49f

找了一个在线加密解密网址(), 计算明文abcpassword的sha-512散列结果如下:

be8795e7a4b2a9d3cd0ab93cfc1d1143dc428ae3f2a8acefa0b565baecf4985a8ad6dd39b755cfad972601de596a3fdb25baf592b552a6b1968d49d3c955c49f

可见他们是一致的



总结:

使用 hash (password + salt) 并不能完全防止黑客盗库后暴力破解/彩虹表破解 密码,只是大大 增加了破解成本


网站安全需要和其他措施一起使用: 

Https, password和salt分开保存 等等





你可能感兴趣的:(shiro)