如果我们需要保存密码这类敏感数据到数据库的话,需要先加密再保存。
在最开始可能有点意识会使用md5码进行存储,但是后面再开发的过程中学习到其实md5码作为密码加密其实也不安全。
因为不可逆MD5算法的hash算法是固定的,所以同一个字符串计算出来的hash串是固定的,可以采用暴力枚举法、字典法、彩虹表(rainbow)法等多种方式破解哈希。
所以我现在一般使用Spring Security 框架中内置的基于 bcrypt 强哈希函数的加密算法实现类来实现密码加密,之所以选择他是因为它内部自己实现了随机加盐处理。使用Bcrypt,每次加密后的密文是不一样的,并且他是号称最安全的加密算法。
注:【暴力枚举法:简单粗暴地枚举出所有原文,并计算出它们的哈希值,看看哪个哈希值和给定的信息摘要一致。 字典法:黑客利用一个巨大的字典,存储尽可能多的原文和对应的哈希值。每次用给定的信息摘要查找字典,即可快速找到碰撞的结果。 彩虹表(rainbow)法:在字典法的基础上改进,以时间换空间。是现在破解哈希常用的办法。 对于单机来说,暴力枚举法的时间成本很高(以14位字母和数字的组合密码为例,共有1.24×1025种可能,即使电脑每秒钟能进行10亿次运算,也需要4亿年才能破解),字典法的空间成本很高(仍以14位字母和数字的组合密码为例,生成的密码32位哈希串的对照表将占用5.7×1014 TB的存储空间)。但是利用分布式计算和分布式存储,仍然可以有效破解MD5算法。因此这两种方法同样被黑客们广泛使用。原文链接:Bcrypt算法(随机加盐,每次加密后的密文都是不一样的)_bcrypt每次加密结果不一样-CSDN博客】