• 中文
    • 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.32w
  • pearPLUS

    请登录之后再进行评论

    登录
  • 0
    [s-32]
  • 0
    [s-1]
  • 单栏布局 侧栏位置: