密码加盐,多重加密

用户密码两次MD5加密:

原因:一次MD5加密,很容易被反编译破解出来,通过前台进行一次MD5加密和后台一次MD5加密,可以有效保证数据的安全性
用户注册逻辑:
  1. 前台获取用户输入的密码(inputPassword),通过固定的salt(盐)例如:String salt=1234abc,通过一定顺序进行组合例如:salt.charAt(1)+salt.charAt(3)+inputPassword+salt.charAt(5)+salt.charAt(6),然后通过前台MD5插件,对组合密码进行加密
  2. 后台获取前台的密码数据(已经加密过一次的fromPassword),后台字母+数字随机生成salt(盐),通过一定顺序进行组合(原理同前台组合加密),然后把组合后的密码通过MD5加密,同时保存经过两次加密的MD5密码和后台随机生成的salt(字母+数字)
用户登录验证逻辑:

如果是用户登录验证,前台获取用户输入的用户名和密码,通过前台固定的salt(盐),通过顺序进行组合使用MD5加密,生成inputPassword和Username并传递给后台,后台获取经过一次加密的inputPassword和userName,通过UserName查询db中用户数据(用户名,密码(dbPassword),salt(随机生成的)),通过db中的salt(盐)+前台传递的inputPassword进行组合使用MD5进行二次加密,和数据库中dbPassword进行equals比较,如果相同则登录成功…

示例:

/**
	 * shiro 权限注解 value可以多值通过","分开,logical表示权限是并且和或的关系
	 *
	 * @return
	 */
	@RequiresPermissions(value = { "admin" }, logical = Logical.OR)
	@RequestMapping("/add")
	@ResponseBody
	public String add(HttpServletRequest request) {
		String userName = request.getParameter("userName");
		String password = request.getParameter("password");
		// 随机生成盐值 salt
		String salt = getRandomString();
		// 原生密码混合salt
		// password=salt.charAt(1)+salt.charAt(3)+password+salt.charAt(5)+salt.charAt(6);
		// 调用封装shiro的MD5加密方法(s1:密码,s2:随机盐值,s3:加密次数)
		String Md5Password = getPassword(password, salt, 2);
		User user = new User();
		user.setUserName(userName);
		user.setPassword(Md5Password);
		user.setPhone("15629048422");
		user.setIdNumber("420116199308160074");
		user.setCreateTime(new Date());
		user.setSalt(salt);
		user.setNickName("汪汪汪");
		user.setState(0);
		user.setGroupId(1);
		user.setSuperMan("0");
		user.setParentId(1);

		userService.add(user);
		return "新增方法";
	}

	/**
	 * 密码加密方法
	 * 
	 * @param password
	 *            密码
	 * @param salt
	 *            盐值
	 * @param hashTimes
	 *            加密次数
	 * @return
	 */
	public static String getPassword(String password, String salt, int hashTimes) {
		// SimpleHash md5Hsh = new SimpleHash(password,salt,hashTimes);
		Md5Hash md5Hash = new Md5Hash(password, salt, hashTimes);
		return md5Hash.toString();
	}

	/**
	 * 盐值字符串
	 */
	String range;

	{
		range = "0123456789abcdefghijklmnopqrstuvwxyz";
	}

	/**
	 * 获取随机盐值
	 * 
	 * @return
	 */
	public String getRandomString() {
		Random random = new Random();

		StringBuffer result = new StringBuffer();
		// 要生成几位,就把这里的数字改成几
		for (int i = 0; i < 7; i++) {

			result.append(range.charAt(random.nextInt(range.length())));

		}

		return result.toString();
	}

示例中使用的demo是SpringBoot整合shiro的retryLimitCredentialsMatcher类进行MD5进行加密,也可以自己编写加密逻辑

发布了32 篇原创文章 · 获赞 53 · 访问量 2485

猜你喜欢

转载自blog.csdn.net/qq_41714882/article/details/103850345