软件测试学习之路

SSM框架新增/修改用户、用户登录时密码加密处理及校验

2018-05-04  本文已影响21人  乘风破浪的姐姐

加密技术Md5Crypt需要在pom文件中导入包:

 <dependency>
      <groupId>commons-codec</groupId>
      <artifactId>commons-codec</artifactId>
      <version>1.10</version>
    </dependency>

一、第一种实现方法
1)、新增用户时,对新增后的用户密码进行加密
在userService.class中实现如下:

 public int adduser(User user) {
       user.setUserid(UUID.randomUUID().toString());
       user.setPassword(Md5Crypt.md5Crypt(user.getPassword().getBytes()));
        return  userMapper.insert(user);
    }

以上方法同样适用于修改用户密码时。
2)、使用新增的用户登录系统时,需要校验用户输入的密码与后台存储的密码是否一致
在loginService.class中实现如下:

 public String checkUser(HttpServletRequest request, User user) {
        UserCriteria example = new UserCriteria();
        String password = user.getPassword();
        example.createCriteria().andUsernameEqualTo(user.getUsername());
        List<User> objs = userMapper.selectByExample(example);
        if(objs.size()>0){
            User user1 = objs.get(0);
            //获取后台的用户密码
            String md5Pass =  MD5CryptUtil.getSalts(user1.getPassword());
            //将用户输入的密码加密
            String pass = Md5Crypt.md5Crypt(password.getBytes(),md5Pass);
            //判断用户输入的密码与后台密码是否一致
            if(!pass.equals(user1.getPassword())){
                request.setAttribute("error", "密码错误!");
                return "index";
            }
                return "main";
            }

        }else{
            request.setAttribute("error", "用户不存在!");
            return "index";
        }
    }

其中加密工具类实现如下:

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

public class MD5CryptUtil
{
    public static void main(String[] args) {
        String tt1 = Md5Crypt.md5Crypt("333".getBytes());
        System.out.println("~~~"+tt1);//$1$lYz58EdG$kfqNTaHTCdLaHCm/7fzXA1
        String mysalt = getSalts(tt1);
                System.out.println("~~~"+mysalt);//$1$lYz58EdG$
        System.out.println("~~~"+Md5Crypt.md5Crypt("333".getBytes(), mysalt));//$1$lYz58EdG$kfqNTaHTCdLaHCm/7fzXA1
    }

    public static String getSalts(String password) {
        String[] salts = password.split("\\$");
        if (salts.length < 1) {
            return "";
        }
        String mysalt = "";
        for (int i = 1; i < 3; i++) {
            mysalt += "$" + salts[i];
        }
        mysalt += "$";
        return mysalt;
    }
}

可以看到,登录时校验密码是否正确,先是取出后台该用户存储的密码,然后截取后台存储密码的$...$这部分。再把Md5Crypt.md5Crypt(用户登录时输入的密码.getBytes(), 截取的后台电部分加密的密码)进行加密,最后比该结果与后台存储的加密密码是否一致,即可校验密码的正确性。

二、md5加密密码还有一种方法,但是感觉不太安全。
以下是用户新增时,将用户密码和userid组合起来进行md5加密。
用户登录时,取登录时输入的密码与后台该用户对应的userid合起来进行md5加密。
最后比较两者是否一致。
1)、在userservice中实现

public int adduser(User user) {
 user.setUserid(UUID.randomUUID().toString());
 user.setPassword(DigestUtils.md5Hex(user.getPassword()+user.getUserid()));
return  userMapper.insert(user);
}

2)、在loginservice类中校验

    public String checkUser(HttpServletRequest request, User user) {
        UserCriteria example = new UserCriteria();
        String password = user.getPassword();
        example.createCriteria().andUsernameEqualTo(user.getUsername());
        List<User> objs = userMapper.selectByExample(example);
        if(objs.size()>0){
            User user1 = objs.get(0);
           String pass = DigestUtils.md5Hex(password +user1.getUserid());
            //判断用户输入的密码与后台密码是否一致
            if(!pass.equals(user1.getPassword())){
                request.setAttribute("error", "密码错误!");
                return "index";
            }else{
                request.getSession().setAttribute("user",user1);
                return "main";
            }

        }else{
            request.setAttribute("error", "用户不存在!");
            return "index";
        }
    }
上一篇下一篇

猜你喜欢

热点阅读