亲宝软件园·资讯

展开

详解Java MD5二次加密的应用

全村最野的狗 人气:0

MD5二次加密的应用

前端和后端加密都可以规定使用密码的某几位作为盐进行加解密操作,而这种约定俗成的盐选取操作只有程序员自己知道,所以安全性较高,不需要前后端传送盐。 或者是前端和后端开发人员在开发的时候商量好这个第一层加密的盐,分别在前端和后端存储起来,这样前端在每次发送密码的时候都使用md5配合盐进行加密,服务器因为知道盐,所以可以自然的解密出来。

答:

当用户第一次注册时

当用户使用用户名和密码进行登录时

如果从对数据库中取出来的密码进行一层解密(即将密码第二次加密后的状态还原为第一次加密后的状态),为什么验证密码的时候,不是直接将这个解密后的密码同前端传过来的被加密后的密码进行比较,从而得出密码是否正确?

答:因为md5是利用hash进行加密的,这是一个不可逆的过程,即使知道hash的结果但是反向推导出hash函数的输入参数几乎是不可能的,所以。

以下是服务端实现两次md5加密的方法,inputPassToFromPass和inputPassToDBPass方法仅仅用于测试,在真实的业务场景中,前端传过来密码的永远不可能是明文密码,一定是经过inputPassToFromPass()方法加密后的密码

import org.springframework.stereotype.Component;
import org.springframework.util.DigestUtils;

import java.nio.charset.StandardCharsets;

/**
 * MD5工具类
 */
@Component
public class MD5Util {
    public static String md5(String str) {
        return DigestUtils.md5DigestAsHex(str.getBytes(StandardCharsets.UTF_8));
    }

    private static final String salt = "1a2b3c4d";

    /**
     * 第一次加密
     **/
    public static String inputPassToFromPass(String inputPass) {
        // salt可以随机的放在输入密码的各个部分当中
        String str = salt.charAt(0) + salt.charAt(2) + inputPass + salt.charAt(5) + salt.charAt(4);
        return md5(str);
    }

    /**
     * 第二次加密, 使用的盐需要重新生成(这个盐会存放到数据库中,成为用户的一个属性),
     **/
    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);
    }

    /**
     * 将第一次加密和第二次加密调用
     */
    public static String inputPassToDBPass(String inputPass, String salt) {
        String fromPass = inputPassToFromPass(inputPass);
        String dbPass = formPassToDBPass(fromPass, salt);
        return dbPass;
    }

    public static void main(String[] args) {
        System.out.println(inputPassToFromPass("123456"));
        System.out.println(formPassToDBPass(inputPassToFromPass("123456"), "abcdefgh"));
        System.out.println(inputPassToDBPass("123456", "abcdefgh"));
    }
}

加载全部内容

相关教程
猜你喜欢
用户评论