- 在Spring Boot项目中,提供了
DigestUtils
工具类,可以轻松实现“使用MD5算法”进行运算,实现将原始密码进行加密,得到一个加密结果。 - 加密防范对象通常是内部员工!
- 对密码进行加密处理的时候,不可以使用加密算法。因为所有的加密算法都是可以解密的。加密算法的核心价值是保证数据在传输过程中是安全的(因为虽然所有加密算法既可以加密,也可以解密,但是解密需要时间,传输的时间比较短)
- 对需要存储的密码进行加密存储的时候,应该使用消息摘要算法,其本质是一种哈希算法,是不可逆的运算。
- 消息摘要算法的典型特征:
- 消息相同则摘要相同
- 无论消息长度如何,摘要的长度是固定的(同一种算法)
- 消息不同,摘要几乎不同
- 常见的消息摘要算法有:
-
MD系列:MD2(128bit)、MD4(128bit)、MD5(128bit)
-
SHA家族:SHA-1(160bit)、SHA-256(256bit)、SHA-384(384bit)、SHA-512(512bit)
注意:如果使用的是MD5算法,运算结果是128个二进制组成(MD5算法的运算结果的种类有2的128次方种,即:340282366920938463463374607431768211456 ),通常,会转换成十六进制表示--32位的十六进制。因为消息算法在运算的时候会丢失一部分数据,所以消息算法都是不可逆的,任何“破解”都不会是“根据密文计算得到原文”的。有一些平台记录了简单的明文密文的对应关系的数据库,以实现“根据密文查询出原文”的效果,但是,只要原文足够复杂(8位长度以上),这些平台不可能收录其对应关系!
为了保证密码原文的复杂性,可以使用“盐”--会做为运算数据的组件部分之一,这样,即使原始密码很简单,原始数据也会比较复杂,也不可能被平台收录如下,原始数据变成“123456jhfdiu78543hjfdo8 ”:
String rawPassword = "123456";
String salt = "jhfdiu78543hjfdo8";
String encodedPassword = DigestUtils.md5DigestAsHex((rawPassword + salt).getBytes());
- 保障用户密码的安全,可行的做法:
- 要求用户密码强度高(密码长,包含字符类型多样化)
- 加盐(盐越复杂越好--但是没必要过于复杂,盐也可以随机)
- 循环加密(将第一次运算后得到的密文作为原文,循环多次)
- 综合以上做法