秒杀商城系统 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));
	}

}
posted @ 2022-05-14 20:08  长勺  阅读(78)  评论(0)    收藏  举报