几乎所有业务系统都会涉及账号登录功能,而密码的安全存储是软件设计者必须要考虑的问题,相信没人还在用明文保存吧。
但初学者甚至一些有经验的程序员还停留在自己实现加密算法或者是用md5这样的算法对用户的明文密码进行加密存储。
md5早在2010年,美国软件工程学会(SEI)就认为MD5算法已被破解,黑客可以使用彩虹表、暴力穷举进行hash碰撞就能轻易破解。因为md5,sha这样的算法速度过于太快,对于一个长度6位的密码在一台普通电脑上不到1分钟就能穷举出来。
所以md5,sha算法一般适用于做数据完整性检查,比如软件签名。
Bcrypt
而目前主流的安全的hash算法就是Bcrypt,它的速度非常慢,加密一次大概需要0.3秒, 这对于正常的业务场景中,0.3秒是完全能接受的。而md5只需要1微秒,两者速度上相差几十万倍。
Bcrypt算法生成的值由4部分组成:
2a表示Bcrypt算法
rounds: 是轮值因子,代表执行hash的次数,数值越高越安全,默认是10
salt: 盐,一个128bits随机字符串,22字符
Hash: 经过明文密码盐salt进行hash得到的值
因为bcrypt采用了一系列各种不同的Blowfish加密算法,并引入了一个 rounds factor,这个轮值因子决定了这个算法的代价有多大。这个算法不会因为计算机CPU处理速度变