【web安全】-- springboot实现两次MD5加密

时间:2023-03-09 13:33:04
【web安全】--  springboot实现两次MD5加密

一、为什么要做两次MD5

客户端MD5:HTTP在网络上是使用明文传输,用户输入的明文密码直接在网络上传输太危险。所以,在客户端需要进行一次MD5(明文+固定盐)。

服务端:防止数据库被入侵,被人通过彩虹表反查出密码。所以服务端接受到后,也不是直接写入到数据库,而是生成一个随机盐,再进行一次MD5后存入数据库。

二、具体步骤

1、引入依赖

 <dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>

2、MD5Util工具类

public class MD5Util {

    /**
* 加密方法
* @param src
* @return
*/
public static String md5(String src) {
return DigestUtils.md5Hex(src);
} //固定盐
private static final String salt = "1a2b3c4d"; /**
* 将用户输入的明文密码与固定盐进行拼装后再进行MD5加密
* @param inputPass
* @return
*/
public static String inputPassToFormPass(String inputPass) {
String str = ""+salt.charAt(0)+salt.charAt(2) + inputPass +salt.charAt(5) + salt.charAt(4);
System.out.println(str);
return md5(str);
} /**
* 将form表单中的密码转换成数据库中存储的密码
* @param formPass
* @param salt 随机盐
* @return
*/
public static String formPassToDBPass(String formPass, String salt) {
String str = ""+salt.charAt(0)+salt.charAt(2) + formPass +salt.charAt(5) + salt.charAt(4);
return md5(str);
} public static String inputPassToDbPass(String inputPass, String saltDB) {
String formPass = inputPassToFormPass(inputPass);
String dbPass = formPassToDBPass(formPass, saltDB);
return dbPass;
} }

3、前台进行加密

//获取密码
var inputPass = $("#password").val();
//获取固定盐
var salt ="1a2b3c4d";
//进行拼装
var str = ""+salt.charAt(0)+salt.charAt(2) + inputPass +salt.charAt(5) + salt.charAt(4);
//加密
var password = md5(str);

4、服务端

 //获取数据库密码
String dbPass = user.getPassword();
//获取数据库卡存储盐
String saltDB = user.getSalt();
//将前台加密后的密码转换成数据库存储的二次加密密码
String calcPass = MD5Util.formPassToDBPass(formPass, saltDB);
//判断是否相等
if(!calcPass.equals(dbPass)) {
//我配置了全局异常处理器,会捕捉这里的异常
throw new GlobalException(CodeMsg.PASSWORD_ERROR);
}