用户密码两次MD5
标签:项目总结

用户密码两次MD5

我们会对用户的密码进行md5加密,但为了安全,我们现在对密码进行添加salt再加密,客户端采用相同的salt,服务端会为每个用户随机生成相应的salt,在对之前加密的拼接后再md5加密,最后将这两次加密的数据和随机生成的salt一起保存到数据库中。

1. 引入相关依赖:
        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.6</version>
        </dependency>
2. 编写MD5的工具类

MD5Util

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

public class MD5Util {
    public static String md5(String src) {
        return DigestUtils.md5Hex(src);
    }

    private static final String salt = "1q2w3e4r";

    /**
     * 第一次md5
     *
     * @param inputPass 用户输入的密码
     * @return
     */
    public static String inputPassFromPass(String inputPass) {
        String str = "" + salt.charAt(5) + salt.charAt(1) + inputPass + salt.charAt(4) + salt.charAt(2);
        return md5(str);
    }

    /**
     * 第二次md5 随机salt
     *
     * @param inputPass
     * @param salt
     * @return
     */
    public static String fromPassToDBPass(String inputPass, String salt) {
        String str = "" + salt.charAt(5) + salt.charAt(1) + inputPass + salt.charAt(4) + salt.charAt(2);
        return md5(str);
    }

    public static String inputPassToDBPass(String input, String saltDB) {
        String fromPass = inputPassFromPass(input);
        String dbPass = fromPassToDBPass(fromPass, saltDB);
        return dbPass;
    }

    public static void main(String[] args) {
//        System.out.println(inputPassFromPass("123456")); //c8a400d7d0f68742b5633dc5a493372e
//        System.out.println(fromPassToDBPass("12345", "11w2e3r4r"));
        System.out.println(inputPassToDBPass("123456", "1q2w3r4r"));
    }
}

上面是对用户的密码两次加密,这里设置固定的salt为 1q2w3e4r,第二次是对传入的随机的salt进行拼接再加密

3. 前端js函数
  function doLogin() {
        g_showLoading();  //loading框,加载中

        var inputPass = $("#password").val();
        var salt = "1q2w3e4r"; //与后端一致,并且拼接算法也要一致
        var str = "" + salt.charAt(5) + salt.charAt(1) + inputPass + salt.charAt(4) + salt.charAt(2);
        var password = md5(str);

        $.ajax({
            url: "/login/do_login",
            type: "POST",
            data: {
                mobile: $("#mobile").val(),
                password: password
            },
            success: function (data) {
                layer.closeAll();
                if (data.code == 0) {
                    layer.msg("成功");
                    window.location.href = "/goods/to_list";
                } else {
                    layer.msg(data.msg);
                }
            },
            error: function () {
                layer.closeAll();
            }
        });
    }
4. service验证
        //验证密码
        String dbPasss = user.getPassword();
        String saltDB = user.getSalt();
        String calcPass = MD5Util.fromPassToDBPass(fromPass, saltDB);
        if (!calcPass.equals(dbPasss)) {
            throw new GlobalException(CodeMsg.PASSWORD_ERROR);
        }

取出salt和用户传上来的加密password再次加密后比较

  • 2 min read

CONTRIBUTORS


  • 2 min read