MD5加盐加密项目示例
-
普通MD5加密
- 简介:可以将任意长度的数据转换成固定长度的散列值,其过程理论上不可逆,无法通过hash值反推出其原始信息,被广泛用于信息加密。
- 理由:由于HTTP是明文传输,所以不能将用户密码直接发送到服务端进行验证,以防被截取。同时,出于安全考虑,数据库中也不要存放明文密码,而是在用户登录时将用户提交的明文密码进行加密,通过与数据库中存放的用户密码的hash值进行比对,从而完成登录验证操作。
- 使用:可以使用Java自带的MD5加密类,或Spring自带的加密工具类。
-
MD5加盐加密
理由:由于相同的密码经加密后,加密结果一样。并且密码过于简单的话,可以通过反向hash查询破解出密码,需要对明文密码进行多次加密、加盐加密。而所加的盐值外界无法得知且可以是随机盐值,所以安全性较普通的MD5加密更为安全。
例如:对下面三个人的密码进行普通的MD5加密后,三人的密码都是123456,记录也一样。
原理:先把密码和盐值合并在一起,再使用MD5对合并后的内容进行验算。盐值可以是用户名、用户邮箱、用户注册时间等固定salt,也可以使用随机salt。
例如:对下面三个人的密码进行加盐加密,盐值是user_code,三人的密码都是123456,但记录并不相同。
-
项目示例
- 注:这里使用Spring自带的MD5加密工具类DigestUtils。
- Controller层
1 //用户注册 2 @RequestMapping("register") 3 public String register(String user_code,String user_name,String user_password, 4 String user_telephone,String user_address,RedirectAttributes attr) throws Exception { 5 6 if(this.userService.isExist(user_code)) { 7 attr.addFlashAttribute("msg", "该账号已存在"); 8 return "redirect:/user/toRegister.action"; 9 } else { 10 //加盐加密,盐是user_code 11 String md5_user_password1 = DigestUtils.md5DigestAsHex((user_code+user_password).getBytes()); 12 //二次加密 13 String md5_user_password2 = DigestUtils.md5DigestAsHex(md5_user_password1.getBytes()); 14 15 this.userService.register(user_code, user_name, md5_user_password2, user_telephone, user_address); 16 attr.addFlashAttribute("msg", "注册成功,请登录"); 17 } 18 19 return "redirect:/user/toLogin.action"; 20 }
1 //登录验证 2 @RequestMapping("login") 3 public String login(String user_code,String user_password,HttpSession session,RedirectAttributes attr) throws Exception { 4 5 //加盐加密,盐是user_code 6 String md5_user_password1 = DigestUtils.md5DigestAsHex((user_code+user_password).getBytes()); 7 //二次加密 8 String md5_user_password2 = DigestUtils.md5DigestAsHex(md5_user_password1.getBytes()); 9 10 User user = this.userService.checkLogin(user_code, md5_user_password2); 11 12 //登陆验证 13 if(StringUtils.isEmpty(user_code) || StringUtils.isEmpty(user_password)) { 14 15 attr.addFlashAttribute("msg", "请输入您的用户名和密码"); 16 return "redirect:toLogin.action"; 17 } else if(user == null) { 18 19 attr.addFlashAttribute("msg", "请输入正确的用户名和密码"); 20 return "redirect:toLogin.action"; 21 } else { 22 23 //验证通过,保存user到session中 24 session.setAttribute("user", user); 25 return "redirect:/toHome.action"; 26 } 27 }