在Spring项目中使用MD5对数据库加密
目录
- 引入
- 密码的算法:
- MD5
- 盐值:salt
- 在Spring项目中引入该算法:
引入
在mysql数据库中,我们常常需要对密码,身份证,手机号等敏感信息进行加密,以保证数据的安全性,如果使用明文存储,当黑客入侵数据库时,就可以轻松获取到用户的相关信息,从而对用户或者企业造成信息泄露或者财产损失
密码的算法:
- 对称密码算法
加密和解密是是一个
y = f(x) , f(x) = y
- 非对称密码算法
使用公钥加密,私钥解密
- 摘要算法
任意长度的数据转化为固定长度的输出数据的一种算法,摘要算法是不可逆的
常见的摘要算法:MD5.SHA系列,CRC
MD5
MD5对新手友好,我们这里介绍MD5对数据库加密:
MD5摘要算法,主要时校验使用,在网络中有很多MD5在线加密工具:菜鸟工具加密
MD5不可逆,那么如何解密呢?
同样的明文经过,同样的加密算法,得到的结果是一样的
验证方法:通过摘要算法处理后的结果,如果密文一样,那么就认为明文是一样的
既然这样的话,我们不能保证数据库中的数据安全,所以我们引入盐值
盐值:salt
你的密码非常简单,我给你加上一段:
明文 + salt = 复杂的明文
对这个复杂的明文进行MD5加密
(这个盐值相对复杂)
在随机盐值的基础上,如何验证:
1.我们能拿到数据库的信息(加上随机盐值的密文)
2.待验证的明文
验证方式:
待验证的明文 + 这个随机盐值 ,进行MD5加密 ,和数据库的明文进行对比
这个随机验证:
用户注册时,把这个随机盐值存储下来
在Spring项目中引入该算法:
package com.example.chatroom;
import org.junit.jupiter.api.Test;
import org.springframework.util.DigestUtils;
import java.util.UUID;
public class SecurityUtilsTest {
// 加密
@Test
public void encrypt() {
String password = "123456";
// Spring 提供的md5加密API
String md5Str = DigestUtils.md5DigestAsHex(password.getBytes());
System.out.println(md5Str);
// 盐值
// JDK提供的 UUID 生成永远不会系统的随机值
// String salt0 = String.valueOf(UUID.randomUUID());
// System.out.println(salt0);
// 这里生产的 UUID 带有 “-” 这里把 “ - ” 替换
String salt = UUID.randomUUID().toString().replace("-","");
System.out.println(salt);
// 加密后的信息: 盐值 + 明文 拼接的字符串 进行加密
String securityPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes());
// salt + 密文 存储在数据库中
String finalPassword = salt + securityPassword;
System.out.println(finalPassword);
}
}
运行结果:
验证:
// 验证
@Test
public void verify(String inputPassword,String sqlPassword) {
// sqlPassword : salt + md5(salt_password)
//第一步先判断 长度
if(sqlPassword == null || sqlPassword.length() != 64) {
System.out.println("校验失败");
}
String salt = sqlPassword.substring(0,32);
String secretPassword = DigestUtils.md5DigestAsHex((salt + inputPassword).getBytes());
String finalPassword = salt + secretPassword;
if(finalPassword.equals(sqlPassword)){
System.out.println("验证成功");
}else {
System.out.println("验证失败");
}
}
项目设计:
注册:
- 生成随机盐值
- 用户明文密码 + 随机盐值,通过MD5进行加密
- 保存随机盐值,和密文
登录(校验):
- 获取用户注册的随机盐值
- 待验证的明文 + 第一步的随机盐值,通过MD5加密
- 通过MD5加密后的密文和用户注册时数据库中存的密文是否一样
package com.example.chatroom.Utils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.DigestUtils;
import java.util.UUID;
@Slf4j
public class SecurityUtils {
/**
* 根据密文加密
* @param password
* @return
*/
public static String encrypt(String password) {
String md5Str = DigestUtils.md5DigestAsHex(password.getBytes());
String salt = UUID.randomUUID().toString().replace("-","");
String securityPassword = DigestUtils.md5DigestAsHex((salt+password).getBytes());
return securityPassword;
}
/**
* 密码校验
* @param inputPassword
* @param sqlPassword
* @return
*/
public static boolean verify(String inputPassword,String sqlPassword) {
if(sqlPassword == null || sqlPassword.length() != 64){
log.error("数据库中的密码格式不对!");
return false;
}
String salt = sqlPassword.substring(0,32);
String secretPassword = DigestUtils.md5DigestAsHex((salt + inputPassword).getBytes());
String finalPassword = salt + secretPassword;
// if(finalPassword.equals(sqlPassword)) {
// return true;
// }else {
// return false;
// }
return finalPassword.equals(sqlPassword);
}
}