第一次加密:
前端使用md5加密,将加密后的密码传给后端。
是为了防止在客户端向服务端传送用户信息时,密码被人截获,所以需要进行一次加密。
var inputPass = $("#password").val();
var salt = g_passsword_salt;
var str = "" + salt.charAt(0) + salt.charAt(2) + inputPass + salt.charAt(5) + salt.charAt(4);
var password = md5(str);
//salt
var g_passsword_salt="9d5b364d"
第二次加密:
后端收到前端加密后的密码后,在存入数据库时再进行一次加密。
(1)需要导入的依赖:
<!--MD5加密-->
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.3</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.8.1</version>
</dependency>
(2)设置md5配置类:
/**
* Description:MD5加密
* Date: 2022/6/28 11:24
**/
@Component
public class MD5Util {
public static String md5(String src){
return DigestUtils.md5Hex(src);
}
private static final String salt="9d5b364d";
public static String inputPassToFromPass(String inputPass){
// 第一次加密
String str=""+salt.charAt(0)+salt.charAt(2) + inputPass +salt.charAt(5) + salt.charAt(4);
return md5(str);
}
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 salt){
String formPass = inputPassToFromPass(inputPass);
String dbPass=formPassToDBPass(formPass,salt);
return dbPass;
}
// 后两个的输出密码应该是相同的
public static void main(String[] args){
// 模拟第一次加密生成的密码(即前端加密生成的密码)
System.out.println(inputPassToFromPass("123456"));
// 模拟第二次加密生成的密码
System.out.println(formPassToDBPass("3457ceaeba3426466887369f1a1f7a88","9d5b364d"));
// 用户输入的密码--->存入数据库的密码的转换
System.out.println(inputPassToDBPass("123456","9d5b364d"));
}
}
(3)对传入参数进行校验:
需要导入的依赖:
<!--参数校验-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
MD5加密后通常是32位编码
@NotNull(message = "密码不能为空")
@Length(min = 32)
private String password;
(4)登录时在service层验证密码是否正确:
// 传入参数 loginVo
String password=loginVo.getPassword();
// 根据手机号验证用户是否存在
User user = userMapper.selectByPhone(mobile);
if(user==null){
throw new GlobalException(ResponseBeanEnum.LOGIN_ERROR);
}
// 验证密码是否正确 不正确则抛出异常
if(!MD5Util.formPassToDBPass(password,user.getSalt()).equals(user.getPassword())){
throw new GlobalException(ResponseBeanEnum.LOGIN_ERROR);
}