当前位置: 首页 > article >正文

2次MD5加密——用于分布式对话

用户端 :

        指发起请求与服务器进行交互的终端设备或应用程序。它可以是电脑、智能手机等。

        用户端负责发送请求给服务端,并接收和处理服务端返回的响应。

服务端 :

        是指提供服务接收和处理用户端请求的计算机系统或应用程序。

        它监听来自用户端的请求并根据请求类型执行相应的逻辑操作服务端处理完请求后,会生成响应并将其发送回用户端。

  • 用户端:PASS=MD5(明文+固定Salt)

  • 服务端:PASS=MD5(用户输入+随机Salt)

        用户端MD5加密是为了防止用户密码在网络中明文传输,服务端MD5加密是为了提高密码的安全性,双重保险

引入pom.xml

<!--        md5依赖-->
<dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
</dependency>

MD5工具类

@Component
public class MD5Util {
​
    private static final String salt = "1a2b3c4d";
​
    //对输入的字符串进行一次MD5哈希运算,返回哈希结果的十六进制表示
    public static String md5(String src) {
        return DigestUtils.md5Hex(src);
    }
​
    /*
    首先,根据事先定义的 salt 字符串,结合输入密码进行组合,生成一个新的字符串。
    然后,对该字符串进行一次MD5哈希运算,返回加密后的结果
     */
    //前端传到后端,加密一次
    public static String inputPassToFromPass(String inputPass) {
        String str = salt.charAt(0) + salt.charAt(2) + inputPass + salt.charAt(5) + salt.charAt(4);
        return md5(str);
    }
​
    //后端到数据库加密一次
    public static String fromPassToDBPass(String fromPass, String salt) {
        String str = salt.charAt(0) + salt.charAt(2) + fromPass + salt.charAt(5) + salt.charAt(4);
        return md5(str);
    }
​
    //真正调用的
    public static String inputPassToDBPass(String inputPass, String salt) {
        String fromPass = inputPassToFromPass(inputPass);
        String dbPass = fromPassToDBPass(fromPass, salt);
        return dbPass;
    }
​
    public static void main(String[] args) {
        //ce21b747de5af71ab5c2e20ff0a60eea
        System.out.println(inputPassToFromPass("123456"));
        //0687f9701bca74827fcefcd7e743d179
        System.out.println(fromPassToDBPass("ce21b747de5af71ab5c2e20ff0a60eea","1a2b3c4d"));
        //真正调用的
        System.out.println(inputPassToDBPass("123456", "1a2b3c4d"));
    }
}

        在业务逻辑类实现根据账号获取密码,接着使用MD5判断输入的密码是否正确:

//判断密码是否正确
        if (!MD5Util.fromPassToDBPass(password, user.getSalt()).equals(user.getPassword())) {
            throw new GlobalException(RespBeanEnum.LOGIN_ERROR);
        }

        需要注意的是,MD5算法虽然在过去广泛使用,但现今已经不推荐将其用于安全敏感的场景,因为MD5算法存在碰撞攻击和预计算攻击等漏洞,容易被破解。而且,单纯多次MD5运算并不能提高其安全性。对于安全加密需求,建议使用更强大和安全的哈希算法,如SHA-256、SHA-3等。


http://www.kler.cn/a/161145.html

相关文章:

  • Django 的 ModelViewSet 中的 get_queryset 方法自定义查询集
  • ReactPress:构建高效、灵活、可扩展的开源发布平台
  • 前端代码分析题(选择题、分析题)——this指向、原型链分析
  • Python 实现阿里滑块全攻略
  • 【算法一周目】双指针(1)
  • 应用系统开发(1)涡流检测设备以及关键技术要点
  • 种下一棵栀子花
  • 先验概率和后验概率
  • KubeSphere Marketpalce 上新!Databend Playground 助力快速启动数据分析环境
  • 交叉验证以及scikit-learn实现
  • axios创建实例对象,发送ajax请求,配置baseUrl
  • 2024 年前端技术发展大趋势一览
  • idea本地调试hadoop 遇到的几个问题
  • 【灰度发布】APP如何实现灰度发布
  • 网络运维与网络安全 学习笔记2023.12.3
  • 2023.12.7
  • Angular 由一个bug说起之三:为什么时不时出现额外的水平/垂直滚动条?怎样能更好的防止它的出现?
  • 配置应用程序监听器[org.springframework.web.context.ContextLoaderListener]错误
  • 简单实现Spring容器(一)
  • shell命令学习(1)——(待完善)
  • pycharm使用Anaconda中的虚拟环境【我的入门困惑二】
  • ros来保存图像和保存记录视频的方法---gmsl相机保存视频和图片
  • java--枚举
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • 关于优雅的使用SQL多行转多列的记录(doris)
  • 如何使用phpStudy本地快速搭建网站并内网穿透远程访问