秒杀07--两次MD5加密设计

秒杀07–两次MD5加密设计

1,什么是MD5加密?
漫画:什么是MD5算法?
https://zhuanlan.zhihu.com/p/55841123
转载自:程序员小灰

2,为什么做MD5?
如果不做任何处理:那么明文密码就会在网络上进行传输,假如说恶意用户取得这个数据包,那么就可以得到这个密码,所有不安全。

3,为什么做两次MD5?

  • 用户端:PASS=MD5(明文+固定Salt)
  • 服务端:PASS=MD5(用户输入+随机Salt)

第一次 (在前端加密,客户端):密码加密是(明文密码+固定盐值)生成md5用于传输,目的由于http是明文传输,当输入密码若直接发送服务端验证,此时被截取将直接获取到明文密码,获取用户信息。加盐值是为了混淆密码,原则就是明文密码不能在网络上传输。
第二次:服务端接收到已经计算过依次MD5的密码后,我们并不是直接存至数据库里面,而是生成一个随机的salt,跟用户输入的密码一起拼装,再做一次MD5,然后再把最终密码存在数据库里面。

第二次的目的:防止数据库被入侵,被人通过彩虹表反查出密码。所以服务端接受到后,也不是直接写入到数据库,而是生成一个随机盐(salt),再进行一次MD5后存入数据库。

也就是:首先需要对用户输入的明文密码进行MD5,然后在把MD5之后的密码传进给服务端,这个就是第一次MD5。
然后我们的服务端接收到用户传过来的密码(经过MD5一次的密码之后),我们并不是直接把它写入到数据库里面,而是说要生成一个随机的salt,对用户输入的这个密码进行一个封装,然后在做一次MD5,然后把MD5和salt同时写入到数据库中。这就是第二次MD5。)

4,下面来进行实现:

  • 在pom文件里面引入两个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>
  • 编写MD5Util工具类用于生成MD5密码:
package com.imooc.miaosha.util;

import org.apache.commons.codec.digest.DigestUtils;

public class MD5Util {
	
	public static String md5(String src) {
		return DigestUtils.md5Hex(src);
	}
	
	private static final String salt = "1a2b3c4d";//这个salt写死了,就是固定在客户端了

	//这里就是把输入的加MD5(也就是第一次的MD5)
	public static String inputPassToFormPass(String inputPass) {
		String str = ""+salt.charAt(0)+salt.charAt(2) + inputPass +salt.charAt(5) + salt.charAt(4);
		System.out.println(str);
		return md5(str);
	}
	//这里就是第二次加MD5(也就是把第一次加入MD5的密码在加MD5写入到数据库中去)
	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);
	}

	//这个是一个整合(输入一个明文,直接进行两次的MD5)
	public static String inputPassToDbPass(String inputPass, String saltDB) {
		String formPass = inputPassToFormPass(inputPass);
		String dbPass = formPassToDBPass(formPass, saltDB);
		return dbPass;
	}


	//下面用main函数来进行以下测试
	public static void main(String[] args) {
		System.out.println(inputPassToFormPass("123456"));//d3b1294a61a07da9b49b6e22b2cbd7f9
		//如果拿到了这个d3b1294a61a07da9b49b6e22b2cbd7f9,通过反查可以得到这个12123456c3(这个也就是加入salt以后的密码,
		// 但不是用户真正的密码,这样就可以加大一些安全性)
//		System.out.println(formPassToDBPass(inputPassToFormPass("123456"), "1a2b3c4d"));
//		System.out.println(inputPassToDbPass("123456", "1a2b3c4d"));//b7797cce01b4b131b433b6acf4add449
	}
	
}

感谢:
参考:https://blog.csdn.net/Brad_PiTt7/article/details/90610572

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读