前几天面试时提到了如何保证密码安全,我说了md5、sha。但面试官还是不太满意。因为有这几点原因:
- 由于MD5历史悠久,大量彩虹表的出现已经使得单纯的MD5运算已经比较容易被破解。
- sha与md5结合,也只是将上述步骤稍微复杂了一点,因为破解这种密码的成本会越来越低,计算出来的结果也会很有价值。
- 在被拖库后,salt也会被拿到,使用彩虹表加salt可以制作新的彩虹表。
- md5本身问题。山大王小云教授已经证明md5是可能被碰撞的。
当然,以上述方式破解密码的工作量是非常庞大的,这样做是否有价值也先不讨论,我们只讨论理论上的可能性。
加随机盐
这也是初学者比较容易遇到的问题,认为给密码加上一个固定字符串,就可以避免彩虹表的攻击。但是这样的话,黑客只要基于这个规则MD5(password+string)运算一次,就可以得到一个密码库,来破解所有用户的密码。
但是,如果给每一个用户加不同的str后缀,也就是加随机盐,黑客在破解的时候,就要为每一个用户创建一个密码库,这样在他破解一个用户密码后,得到的密码库无法继续使用。极大地增加了破解成本。
当然,如果黑客得到了你的库,这个方法就没什么意义了。
bcrypt加随机盐
这个方式比上一个优势更大的地方在于,黑客即使得到了你的salt盐库,自己制作密码库的时间将无限增加,因为bcrypt可以控制每秒只计算出三个密码。
另外,初始密码在客户端肯定会经过一层md5加密,建议更改为sha-2加密。