两次加密加密的是什么?
第一次客户端加密(前端加密)
第二次服务端加密(后端加密)
第一次客户端加密方式:明文+固定盐值
第二次服务端:第一次前端传过来的密码+随机盐值
项目里面模拟的是登录查询的过程
整个过程分析如下:首先,第一次用户注册的时候输入框输入明文,然后前端再加固定盐值,
第二次前端传过来第一次加密的+后端随机生成的盐值,该盐值要存入数据库
查询的时候,第一次客户端明文+固定盐值,传入后端,第二次后端去查询数据库注册时候后端随机生成的盐值,
把第一次前端传过来的加密的+数据库查询的随机盐值成密码,然后和数据库里面的密码对比是否一致
前端后端都加密所以是两次md5
两次MD5加密的意义?
保证客户端、服务端密码的安全性,即使利用彩虹表反查,难度也是比较大
两次MD5的实现?
1引入jar包
<!--md5加密Md5Util-->
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.6</version>
</dependency>
2.工具类
**
* 1.客户端:密码加固定盐值
* 2,服务端:密码加随机盐值
* @author Administrator
*/
public class Md5Util {
public static final String SALT = "1a2b3c4d";
public static String md5(String str) {
return DigestUtils.md5Hex(str);
}
/**
* 模拟注册的时候前端生成的密码,明文加固定盐值SALT
* @param inputPass 输入框密码
* @return 加密后的密码
*/
public static String inputPassToFormPass(String inputPass) {
String str = "" + SALT.charAt(0) + SALT.charAt(2) + inputPass + SALT.charAt(5) + SALT.charAt(4);
return md5(str);
}
/**
* 模拟后端获取前端加密后的密码,前端密码+随机盐值,注册的时候需要将盐值存到数据库
* @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);
}
/**
* 模拟注册,从前端和后端加密后的密码生成到数据库
* @param inputPass 前端加密密码
* @param salt 后端盐值
* @return 数据库两次加密后密码
*/
public static String inputPassToDbPass(String inputPass, String salt) {
String formPass = inputPassToFormPass(inputPass);
String dbPass = FormPassToDbPass(formPass, salt);
return dbPass;
}
/**
* 测试
* @param args
*/
public static void main(String[] args) {
System.out.println(inputPassToFormPass("123456"));
System.out.println(FormPassToDbPass(inputPassToFormPass("123456"),"123456"));
System.out.println(inputPassToDbPass("123456","123456"));
}
}
模拟登录的时候校验密码
//获取数据库随机盐值
String salt = secKillUser.getSalt();
//判断前后端两次MD5的时候密码是否一致
String inputPassword = Md5Util.FormPassToDbPass(password, salt);
// 注册时候生成的密码,也就是注册的时候生成的密码
String dbPassword = secKillUser.getPassword();
if (!inputPassword.equals(dbPassword)) {
throw new GlobalException(CodeMsg.PASSWORD_ERROR);
}