Java-两次MD5加密

两次加密加密的是什么?

第一次客户端加密(前端加密)
第二次服务端加密(后端加密)

第一次客户端加密方式:明文+固定盐值
第二次服务端:第一次前端传过来的密码+随机盐值
项目里面模拟的是登录查询的过程
整个过程分析如下:首先,第一次用户注册的时候输入框输入明文,然后前端再加固定盐值,
第二次前端传过来第一次加密的+后端随机生成的盐值,该盐值要存入数据库
查询的时候,第一次客户端明文+固定盐值,传入后端,第二次后端去查询数据库注册时候后端随机生成的盐值,
把第一次前端传过来的加密的+数据库查询的随机盐值成密码,然后和数据库里面的密码对比是否一致
前端后端都加密所以是两次md5

两次MD5加密的意义?

保证客户端、服务端密码的安全性,即使利用彩虹表反查,难度也是比较大

两次MD5的实现?
1引入jar包
     <!--md5加密Md5Util-->
        <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.工具类
  **
 * 1.客户端:密码加固定盐值
 * 2,服务端:密码加随机盐值
 * @author Administrator
 */
public class Md5Util {
    public static final String SALT = "1a2b3c4d";

    public static String md5(String str) {
        return DigestUtils.md5Hex(str);
    }

    /**
     * 模拟注册的时候前端生成的密码,明文加固定盐值SALT
     * @param inputPass 输入框密码
     * @return 加密后的密码
     */
    public static String inputPassToFormPass(String inputPass) {
        String str = "" + SALT.charAt(0) + SALT.charAt(2) + inputPass + SALT.charAt(5) + SALT.charAt(4);
        return md5(str);
    }

    /**
     * 模拟后端获取前端加密后的密码,前端密码+随机盐值,注册的时候需要将盐值存到数据库
     * @param formPass 前端加密后的密码
     * @param salt 后端随机生成的盐值
     * @return 存到数据库的密码
     */
    public static String FormPassToDbPass(String formPass, String salt) {
        String str = "" + salt.charAt(0) + salt.charAt(2) + formPass + salt.charAt(5) + salt.charAt(4);
        return md5(str);
    }

    /**
     * 模拟注册,从前端和后端加密后的密码生成到数据库
     * @param inputPass 前端加密密码
     * @param salt 后端盐值
     * @return 数据库两次加密后密码
     */
    public static String inputPassToDbPass(String inputPass, String salt) {
        String formPass = inputPassToFormPass(inputPass);
        String dbPass = FormPassToDbPass(formPass, salt);
        return dbPass;
    }

    /**
     * 测试
     * @param args
     */
    public static void main(String[] args) {
        System.out.println(inputPassToFormPass("123456"));
        System.out.println(FormPassToDbPass(inputPassToFormPass("123456"),"123456"));
        System.out.println(inputPassToDbPass("123456","123456"));

    }
}
模拟登录的时候校验密码
  //获取数据库随机盐值
        String salt = secKillUser.getSalt();
        //判断前后端两次MD5的时候密码是否一致
        String inputPassword = Md5Util.FormPassToDbPass(password, salt);
        // 注册时候生成的密码,也就是注册的时候生成的密码
        String dbPassword = secKillUser.getPassword();
        if (!inputPassword.equals(dbPassword)) {
            throw new GlobalException(CodeMsg.PASSWORD_ERROR);
        }

项目实现地址

两次MD5实现

你可能感兴趣的:(Springboot,算法,原理)