密碼加鹽,多重加密

用戶密碼兩次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進行加密,也可以自己編寫加密邏輯

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章