• 普通MD5加密

  1. 简介:可以将任意长度的数据转换成固定长度的散列值,其过程理论上不可逆,无法通过hash值反推出其原始信息,被广泛用于信息加密。
  2. 理由:由于HTTP是明文传输,所以不能将用户密码直接发送到服务端进行验证,以防被截取。同时,出于安全考虑,数据库中也不要存放明文密码,而是在用户登录时将用户提交的明文密码进行加密,通过与数据库中存放的用户密码的hash值进行比对,从而完成登录验证操作。
  3. 使用:可以使用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     }

     

版权声明:本文为jiachao原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/jiachao/p/10144245.html