在一次Springboot项目中看到了一个登录功能的MD5加密功能,故记录下来。
在用户端输入密码到传入服务端,再传到数据库的过程中,进行了2次MD5加密。
第一次加密:
用户输入的密码是明文密码,如果不进行加密的话会在网络中直接进行传输,很有可能会被别人截获, 用户端对密码进行加密主要是为了防止用户密码在网络中进行明文传输。
第二次加密:
在服务端接到用户端对密码进行加密之后,存到数据库之前再进行一次加密
为什么不直接传入数据库呢?为什么要用服务端这边再进行加密呢?
因为MD5加密本身安全性不是特别高
万一数据库被暴露了之后可以根据我们加密后的密文以及盐的字段反推出之前的明文密码。所以这一次在加密,就算暴露了数据库,解开了这个密文之后还是一个密文,就提高了安全性。
要使用MD5,就要准备这样一个工具类
添加依赖
<!-- md5 依赖 -->
<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>
@Component
public class MD5Util {
public static String md5(String src){
return DigestUtils.md5Hex(src);
}
private static final String salt="1a2b3c4d";
public static String inputPassToFormPass(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 = inputPassToFormPass(inputPass);
String dbPass = formPassToDBPass(formPass,salt);
return dbPass;
}
public static void main(String[] args) {
// 前端给客户端的
System.out.println("前端给客户端的:第一次MD5");
System.out.println(inputPassToFormPass("lovehui"));
// 客户端给DB
System.out.println("客户端给DB:第二次MD5");
System.out.println(formPassToDBPass("93750201a12648cb799c9ce900c429a9",salt));
// 验证前两个方法
System.out.println("前端明文直接给DB");
System.out.println(inputPassToDBPass("lovehui",salt));
}
}
运行结果:
前端给客户端的:第一次MD5
93750201a12648cb799c9ce900c429a9
客户端给DB:第二次MD5
75c2083733676716c9093354f927f475
前端明文直接给DB
75c2083733676716c9093354f927f475
一次简单的体验,记录一下。