发表于: 2020-06-30 20:12:11

0 1771


今天完成的事情:

1.代码中加入登录注册功能

2.md5加盐加密

工具类:

public class Md5Util2 {
/**
    * 计算一个字符串的MD5信息
    *
    * @param str 字符串
    * @return MD5值
    */
   public static String getMD5(String str) {
try {
// 生成一个MD5加密计算摘要
           MessageDigest md = MessageDigest.getInstance("MD5");
           // 计算md5函数
           md.update(str.getBytes());

           // digest()最后确定返回md5 hash值,返回值为8为字符串。因为md5 hash值是16位的hex值,实际上就是8位的字符
           // BigInteger函数则将8位的字符串转换成16位hex值,用字符串来表示;得到字符串形式的hash值
           return new BigInteger(1, md.digest()).toString(16);

       } catch (Exception e) {
e.printStackTrace();
           return str;
       }
}
/**
    * 获取48位加密密码
    *
    */
   public static String generate(String password) {
Random r = new Random();
       StringBuilder sb = new StringBuilder(16);
       sb.append(r.nextInt(99999999)).append(r.nextInt(99999999));
       int len = sb.length();
       if (len < 16) {
for (int i = 0; i < 16 - len; i++) {
sb.append("3");
           }
}
String salt = sb.toString();
       password = getMD5(password + salt);
       char[] cs = new char[48];
       for (int i = 0; i < 48; i += 3) {
cs[i] = password.charAt(i / 3 * 2);
           char c = salt.charAt(i / 3);
           cs[i + 1] = c;
           cs[i + 2] = password.charAt(i / 3 * 2 + 1);
       }
return new String(cs);
   }
/**
    * 校验密码是否正确
    */
   public static boolean verify(String password, String md5) {
char[] cs1 = new char[32];
       char[] cs2 = new char[16];
       for (int i = 0; i < 48; i += 3) {
cs1[i / 3 * 2] = md5.charAt(i);
           cs1[i / 3 * 2 + 1] = md5.charAt(i + 2);
           cs2[i / 3] = md5.charAt(i + 1);
       }
String salt = new String(cs2);
       return getMD5(password + salt).equals(new String(cs1));
   }
}

注册加密:

@RequestMapping(value = "/reg", method = RequestMethod.POST)
public String addUser(@Valid User user, BindingResult bindingResult, Model model) throws Exception {

if (bindingResult.hasErrors()) {
FieldError fe = bindingResult.getFieldError();
       return "register";
   }
String pwd=user.getPwd();
   String md5pwdSalt=Md5Util2.generate(pwd);
   user.setPwd(md5pwdSalt);
   long createAt = DateUtil.timestamp();
   user.setCreateAt(createAt);
   boolean check = userService.check(user.getUsername());
   if (check) {
model.addAttribute("message","用户名已被使用,请更换用户名");
       return "register";
   } else {
userService.addUser(user);
   }
return "login";
}

登录检验:

@RequestMapping(value = "/login", method = RequestMethod.POST)
public String login(User user, HttpSession session, Model model) {
String pwd = user.getPwd();
   String username=user.getUsername();
   String md5pwd = userService.checkpwd(username);
   boolean match=Md5Util2.verify(pwd,md5pwd);
   if (match) {
user.setPwd(md5pwd);
       userService.login(user);
       return "redirect:/u/show1";

   } else {
model.addAttribute("message", "用户名不存在或密码错误,请重新登录。");
   }
return "login";
}

明天计划的事情:学习cookie完成任务五
遇到的问题:

使用Spring自带的md5加密不知道加盐加密怎么弄,又换了一个。
收获:

理解了密码加密


返回列表 返回列表
评论

    分享到