秒杀商城系统 MD5加密 (六)
什么是MD5加密?
通俗说
-
md5是一种信息摘要算法,它可以从需要加密的数据中按照一定的规则生成一个特殊的字符串,并且一个文件所对应的MD5摘要是固定的,当文件内容变化后,其MD5值也会不一样,因此,在应用中经常使用MD5值来验证一段数据有没有被篡改。
-
比如,在数据的发送方将原始数据生成出MD5值,然后把原始数据连同其MD5值一起传给接收方,接收该收到数据后,先将原始数据用MD5算法生成摘要信息,然后再将此摘要信息与发送方发过来的摘要信息进行比较,如果一致就认为原始数据没有被修改,否则原始数据就是被修改过了。
如果还不太理解,可以参考这个https://mp.weixin.qq.com/s/k-ToL356asWtS_PN30Z17w
为什么做MD5?
- 如果不做任何处理,那么明文密码就会在网络上进行传输,假如说恶意用户取得这个数据包,那么就可以得到这个密码,所以不安全。
为什么做两次MD5?
- 第一次 (在前端加密,客户端):密码加密是(明文密码+固定盐值)生成md5用于传输,目的由于http是明文传输,当输入密码若直接发送服务端验证,此时被截取将直接获取到明文密码,获取用户信息。加盐值是为了混淆密码,原则就是明文密码不能在网络上传输。
- 第二次:服务端接收到已经计算过依次MD5的密码后,我们并不是直接存至数据库里面,而是生成一个随机的salt,跟用户输入的密码一起拼装,再做一次MD5,然后再把最终密码存在数据库里面。
第二次的目的:
防止数据库被入侵,被人通过彩虹表反查出密码。所以服务端接受到后,也不是直接写入到数据库,而是生成一个随机盐(salt),再进行一次MD5后存入数据库。
md5代码实现过程
1. 在pom文件里面引入两个MD5的依赖
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.9</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.6</version>
</dependency>
2. 编写MD5Util工具类用于生成MD5密码:
学会一种思想,和业务无关的代码尽量实现复用,比如封装成工具类,后面方便我们使用
public class MD5Util {
public static String md5(String src) {
return DigestUtils.md5Hex(src);
}
//客户端固定的salt,跟用户的密码做一个拼接
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);
System.out.println(md5(str));
return md5(str); //char类型计算会自动转换为int类型
}
//二次MD5
public static String formPassToDBPass(String formPass,String salt) {//随机的salt
String str=""+salt.charAt(0)+salt.charAt(2)+formPass+salt.charAt(5)+salt.charAt(4);
return md5(str);
}
//数据库md5,使用数据库随机salt
public static String inputPassToDbPass(String input,String saltDB) {
String formPass=inputPassToFormPass(input);
String dbPass=formPassToDBPass(formPass,saltDB);
return dbPass;
}
public static void main(String[] args) {
String pass = "123456";
String salt = "1a2b3c4d";
System.out.println(inputPassToDBPass(pass,salt));
}
}