常见的加密方式
1、对称加密(可逆)
加密操作:用户输入的明文+密钥得到加密的结果,加密结果存储到数据库中
解密操作:密文通过密钥进行解密得到明文
2、Hash加密(不可逆)
加密操作:明文通过哈希算法进行加密,加密后的密文存储到数据库中
验证密码操作:用户输入的明文通过同样的哈希算法进行加密,比对数据库中的密文,看是否一致
3、Hash+盐值加密(盐值就是随机数)
加密操作:明文通过哈希算法进行加密,得到加密结果,生成盐值,加密结果和盐值进行拼接得到最终加密结果
验证密码操作:用户输入的明文通过相同的哈希算法进行加密,得到加密结果,接着从数据库中获取盐值,加密结果和盐值经过相同的拼接方式得到最终结果,最终结果和数据库中存储的最终结果进行比对,看是否一致
自定义一个加密工具
public class SecurityUtil {/*** 加密*/public static String encrypt(String password) {if (!StringUtils.hasLength(password)) {throw new RuntimeException();}//1.生成盐值String salt = UUID.randomUUID().toString().replace("-", "");//把-替换成空字符//2.盐值+password(也可以使用其他的拼接规则,看心情)//3.对 盐值+password 进行加密 得到密文String securityPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes(StandardCharsets.UTF_8));//数据库中保存盐值 和 密文 得到64位16进制的数据return salt + securityPassword;}/*** 验证*/public static boolean verify(String inputPassword, String sqlPassword) {//参数校验if (!StringUtils.hasLength(inputPassword) || !StringUtils.hasLength(sqlPassword)) {return false;}if (sqlPassword.length() != 64) {return false;}//获取盐值String salt = sqlPassword.substring(0, 32);//得到32位的密文String securityPassword = DigestUtils.md5DigestAsHex((salt + inputPassword).getBytes(StandardCharsets.UTF_8));return sqlPassword.equals(salt + securityPassword);}
}
使用现成的工具
我们也可以使用现成的工具
首先引入依赖
<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.25</version>
</dependency>
编写测试代码,这里我们对密码进行哈希算法+sha256的方法加密,对于电话号码,使用对称加密
@SpringBootTest
public class EncryptTest {//密码 hash sha256@Testvoid sha256Test() {String password = DigestUtil.sha256Hex("123456");System.out.println("sha256 hash 处理后的结果为");System.out.println(password);//8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92}//手机号 对称加密 aes@Testvoid aesTest() {//生成密钥,密钥长度必须是16字节或者24或者32byte[] key = "1234556789abcdef".getBytes(StandardCharsets.UTF_8);//生成aes对象AES aes = SecureUtil.aes(key);//加密String encrypted = aes.encryptHex("12345");System.out.println("经过aes加密后的结果为: " + encrypted);//解密String decryptStr = aes.decryptStr(encrypted);System.out.println("经过aes解密后的结果为:" + decryptStr);}}