常见的加密方式
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
@Test
void sha256Test() {
String password = DigestUtil.sha256Hex("123456");
System.out.println("sha256 hash 处理后的结果为");
System.out.println(password);
//8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92
}
//手机号 对称加密 aes
@Test
void aesTest() {
//生成密钥,密钥长度必须是16字节或者24或者32
byte[] 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);
}
}

被折叠的 条评论
为什么被折叠?



