MD5实在太出名了,特别是刚毕业的同学脑子里就是Hash,MD5,AES几种,其实算法的世界就跟森林一样,还每一颗都不同。各有各的特长和适用场景,多年前MD5因为计算的复杂度一度被认为不可破解,但是随着cpu的摩尔定律现在已经可以被破解了。玩SS的同学不妨可以切换几种试试,小众的可能被侦测的概率会更小。
回归正题,黑客拿到网站数据库后当然就是破解用户的加密密码,这个时候MD5加密的密码网站上有专门的rainbow服务提供碰撞破解,甚至常见的人家都已经cache了,碰撞都不需要。道高一尺魔高一丈想不被破解除了采用加salt这类亡羊补牢的办法外更换算法才是最有效果的。DANG!DANG!有请主角Bcrypt出场,前面MD5之所以被破解是因为它的复杂计算后来可以被CUDA方式加速计算,结果就是可能1ms就够了,对于高级显卡个人PCrainbow都没问题。
所以bcrypt的特点之一就是不能被gpu加速;特点二本身要够慢,当破解需要几十上百年的时候也就可以认为它不可被破解,所以算法本身除了复杂度外怎么就是更慢,对于算法来说要做到这个可不容易,bcrypt采用了Blowfish的算法,让他慢的在算法里都显得特别奇葩,前面1ms的加密它可能需要0.3秒。算法终究是会过时的,bcrypt为了延长生命期还增加了salt和work factor,后者可以自由更改用于增加因为cpu性能增加让系统计算更慢。
'$2b$12$nf3TdEFJZ6AtRA7N9r1f.OANfpFS9Qxtklo4km.LHbuEV7Mu5jJN2'
上面就是一段用bcrypt加密‘mypassword’后的结果,这里$是分隔符没有意义,2b代表算法版本,12代表work factor。
对于一些大型站点可能不会用bcrypt毕竟它太慢,但是对于中小型站点来说它足够安全且用于频率很低的密码还是很不错的选择。
PS:wp和gitlab都是用的bcrypt。