• 中文
    • English
  • 注册
  • 查看作者
    • SpringBoot:对密码进行MD5加密

      一.  数据准备

      1.  创建一个user表:

      CREATE TABLE users
      (
          user_id     INT(6) AUTO_INCREMENT PRIMARY KEY,
          name        VARCHAR(100)                        NULL,
          password    VARCHAR(100)                        NULL,
          status      INT(1)    DEFAULT 1                 NULL,
          create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL
      );

      2.  创建对应的实体类

      import java.sql.Timestamp;
      
      public class User {
          private Integer userId;
          private String name;
          private String password;
          private Integer status;
          private Timestamp createTime;
          //getter,setter,toString.....
      }

      3.  UserMapper

      public interface UserMapper {
          User queryByName(String name);
          Integer doInsert(User user);
      }

      4.  UserMapper.xml

      <?xml version="1.0" encoding="UTF-8" ?>
      <!DOCTYPE mapper
              PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
              "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
      
      <mapper namespace="io.zhangjia.springbootmd5.mapper.UserMapper">
          <select id="queryByName" resultType="user">
              SELECT *
              FROM users
              WHERE name = #{name}
          </select>
          <insert id="doInsert" useGeneratedKeys="true" keyProperty="userId">
              INSERT INTO users (name, password) VALUE (#{name}, #{password})
          </insert>
      </mapper>

      二. MD5加密

      MD5是一种常用的加密算法,且该加密算法是单向的,也就是说是不可逆的,但是固定的值的MD5密文是固定的,所以网上有很多在线的MD5解密网站,但基本上都是采用撞库等原理,破解率也很低。可以采用多次加密等方法降低破解率。

      Spring为我们提供了一个与MD5相关的工具类:DigestUtils,通过调用该类的md5DigestAsHex方法,并传入一个字节数组即可生成对应的MD5密文:

      @Test
      public void md5(){
          String s = "zhangjia";
          System.out.println(DigestUtils.md5DigestAsHex(s.getBytes()));
      }
      
      输出:
      0d3159db0bb0eb3ea0a74aa21ae3e826

      上面的输出即为zhangjia所对应的md5,但是这样直接加密非常不安全,我们可以采用拼接字符串的方法来生成md5,以用户注册为例,我们可以把用户名+密码 拼接起来后,再转换成md5

      三.  使用MD5加密后实现用户登录注册

      用户的登录以及注册和我们以前的项目几乎一模一样,但是在登录的时候,不能再直接使用用户输入的密码和数据库中的密码进行比对。应首先将用户输入的密码按照我们规定的转换规则先转换成MD5,然后再将其和数据库的密码进行比对。同样注册的时候,存储密码前需要先将其转换为md5的格式再存储。 UserServiceImpl.java:

      import java.util.HashMap;
      import java.util.Map;
      
      @Service("userService")
      public class UserServiceImpl implements UserService {
          @Autowired
          private UserMapper userMapper;
          @Override
          public Map<String, Object> login(String name, String password) {
              Map<String, Object> map = new HashMap<>();
              User user = userMapper.queryByName(name);
              if(user == null) {
                  map.put("error","用户名不存在");
              } else {
                  String password2 = user.getPassword();
                  String md5 = MD5Util.getMd5(name.concat(password));
                  if(password2.equals(md5)) {
                          user.setPassword(null);
                      map.put("success",true);
                      map.put("user",user);
                  } else {
                      map.put("error","密码错误");
                  }
              }
              return map;
          }
      
          @Override
          public Map<String, Object> register(String name, String password) {
      
              Map<String,Object> map = new HashMap<>();
              if(userMapper.queryByName(name) == null) {
                  String md5 = MD5Util.getMd5(name.concat(password));
                  User user = new User();
                  user.setName(name);
                  user.setPassword(md5);
                  Integer integer = userMapper.doInsert(user);
                  map.put("success", integer == 1);
              } else {
                  map.put("error","用户名已经存在啦");
              }
              return map;
          }
      }

      最后编写Controller即可:

      import io.zhangjia.springbootmd5.entity.User;
      import io.zhangjia.springbootmd5.service.UserService;
      import io.zhangjia.springbootmd5.util.R;
      import io.zhangjia.springbootmd5.util.Result;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.stereotype.Controller;
      import org.springframework.web.bind.annotation.PostMapping;
      import org.springframework.web.bind.annotation.ResponseBody;
      
      import java.util.Map;
      
      
      @Controller
      public class UserController2 {
          @Autowired
          private UserService userService;
      
          @PostMapping(value = "/login", produces = "application/json;charset=utf-8")
          @ResponseBody
          public R login(String name, String password) {
              Map<String, Object> map = userService.login(name, password);
              if (map.containsKey("error")) {
                  return R.error(map);
              } else {
                  return R.success(map);
              }
          }
      
          @PostMapping(value = "/register", produces = "application/json;charset=utf-8")
          @ResponseBody
          public R register(String name, String password) {
              Map<String, Object> map = userService.register(name, password);
              if (map.containsKey("error")) {
                  return R.error(map);
              } else {
                  return R.success(map);
              }
          }
      
      }

      假如我们的数据库中有一个用户:zhangjia,密码也是zhangjia,那么我们访问http://localhost:8888/login?name=zhangjia&password=zhang,则页面显示:

      {
      "data": {
      "error": "密码错误"
      },
      "success": false
      }

      如果输入一个不存在的用户名,则页面显示

      {
      "data": {
      "error": "用户名不存在"
      },
      "success": false
      }

    • 0
    • 2
    • 0
    • 1.24w
    • pearPLUS

      请登录之后再进行评论

      登录
    • 0
      [s-32]
    • 0
      [s-1]
    • 赞助本站

      • 支付宝
      • 微信
      • QQ

      感谢一直支持本站的所有人!

      单栏布局 侧栏位置: