【MD5加密结果不一致问题】同一个文本字符串,使用MD5加密之后,得出的加密结果居然不相同

news2025/1/11 22:49:20

目录

1.1、错误描述

1.2、解决方案

1.3、MD5工具类


1.1、错误描述

今天工作中,遇到一个奇怪的问题,我负责对接第三方的短信发送接口,接口中有一个入参是sign加签字段,根据短信内容进行MD5加密
之后得到,于是我就是使用JDK自带的MD5加密算法,写了一个加密方法,代码如下:

package com.gitcode.demo.util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.security.MessageDigest;

/**
 * @version 1.0.0
 * @Date: 2023/8/24 10:41
 * @Author ZhuYouBin
 * @Description: MD5 加密工具类
 */
public class MD5Util {
    private static final Logger logger = LoggerFactory.getLogger(MD5Util.class);

    /**
     * 使用MD5加密
     * @param raw 明文
     */
    public static String encryptByJdk(String raw) {
        try {
            logger.info("MD5加密之前内容: {}", raw);
            if (raw == null || "".equals(raw.trim())) {
                return null;
            }
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] inputBytes = raw.getBytes();
            byte[] hashedBytes = md.digest(inputBytes);
            StringBuilder sb = new StringBuilder();
            for (byte b : hashedBytes) {
                sb.append(String.format("%02x", b));
            }
            logger.info("MD5加密之后内容: {}", sb);
            return sb.toString();
        } catch (Exception e) {
            logger.error("MD5加密异常:", e);
            e.printStackTrace();
        }
        return null;
    }

    public static void main(String[] args) {
        String msg = "短信测试内容";
        encryptByJdk(msg);
    }
}

于是开始调用接口,哎,居然失败了,接着问接口负责人,考虑是不是MD5的加密结果不同,于是对方给了一个在线加密工具,让我对比下加密的结果是不是一样的,地址:https://c.runoob.com/front-end/703/。使用这个工具加密出来的结果,还真和JDK的MD5加密结果不一样,如下图所示。

奇了怪,我寻思是不是JDK的MD5加密有问题,于是我就是要Spring提供的MD5加密算法重新写了个代码:

package com.gitcode.demo.util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.DigestUtils;

/**
 * @version 1.0.0
 * @Date: 2023/8/24 10:41
 * @Author ZhuYouBin
 * @Description: MD5 加密工具类
 */
public class MD5Util {
    private static final Logger logger = LoggerFactory.getLogger(MD5Util.class);

    /**
     * 使用MD5加密
     * @param raw 明文
     */
    public static String encrypt(String raw) {
        try {
            logger.info("MD5加密之前内容: {}", raw);
            if (raw == null || "".equals(raw.trim())) {
                return null;
            }
            String md5 = DigestUtils.md5DigestAsHex(raw.getBytes());
            logger.info("MD5加密之后内容: {}", md5);
            return md5;
        } catch (Exception e) {
            logger.error("MD5加密异常:", e);
            e.printStackTrace();
        }
        return null;
    }

    public static void main(String[] args) {
        String msg = "短信测试内容";
        encrypt(msg);
    }
}

不出意外,就要出意外,加密的结果还是不一样,后面查看了一些博客文章,发现是编码的问题,我的IDEA是使用的GBK编码。我把编码改成UTF-8,再次进行加密,发现居然可以了,但是这样也不行呀,发到现场环境又没有IDEA,最终是需要在调用【getBytes()】方法的时候,指定字符集编码。

1.2、解决方案 

MD5加密时候,需要显示的指定采用的字符集编码,在调用【getBytes()】方法时候,指定字符集编码,一般采用UTF-8编码就可以啦,如下所示:

getBytes(StandardCharsets.UTF_8)

// 或者
getBytes("UTF-8")

1.3、MD5工具类

package com.gitcode.demo.util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.DigestUtils;

import java.nio.charset.StandardCharsets;

import java.security.MessageDigest;

/**
 * @version 1.0.0
 * @Date: 2023/8/24 10:41
 * @Author ZhuYouBin
 * @Description: MD5 加密工具类
 */
public class MD5Util {
    private static final Logger logger = LoggerFactory.getLogger(MD5Util.class);

    /**
     * 使用MD5加密
     * @param raw 明文
     */
    public static String encrypt(String raw) {
        try {
            logger.info("MD5加密之前内容: {}", raw);
            if (raw == null || "".equals(raw.trim())) {
                return null;
            }
            String md5 = DigestUtils.md5DigestAsHex(raw.getBytes(StandardCharsets.UTF_8));
            logger.info("MD5加密之后内容: {}", md5);
            return md5;
        } catch (Exception e) {
            logger.error("MD5加密异常:", e);
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 使用MD5加密
     * @param raw 明文
     */
    public static String encryptByJdk(String raw) {
        try {
            logger.info("JDK中的MD5加密之前内容: {}", raw);
            if (raw == null || "".equals(raw.trim())) {
                return null;
            }
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] inputBytes = raw.getBytes(StandardCharsets.UTF_8);
            byte[] hashedBytes = md.digest(inputBytes);
            StringBuilder sb = new StringBuilder();
            for (byte b : hashedBytes) {
                sb.append(String.format("%02x", b));
            }
            logger.info("JDK中的MD5加密之后内容: {}", sb);
            return sb.toString();
        } catch (Exception e) {
            logger.error("MD5加密异常:", e);
            e.printStackTrace();
        }
        return null;
    }

    public static void main(String[] args) {
        String msg = "短信测试内容";
        encrypt(msg);
        encryptByJdk(msg);
    }
}

到此,MD5加密结果不一致的问题就解决啦,根本原因还是采用的字符集不一致,其实使用JDK和Spring的加密方法都一样,只不过要保证使用相同的编码字符集。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/923088.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32使用PID调速

STM32使用PID调速 PID原理 PID算法是一种闭环控制系统中常用的算法,它结合了比例(P)、积分(I)和微分(D)三个环节,以实现对系统的控制。它的目的是使 控制系统的输出值尽可能接近预…

基于Llama2和LangChain构建本地化定制化知识库AI聊天机器人

参考: 本项目 https://github.com/PromtEngineer/localGPT 模型 https://huggingface.co/TheBloke/Llama-2-7B-Chat-GGML 云端知识库项目:基于GPT-4和LangChain构建云端定制化PDF知识库AI聊天机器人_Entropy-Go的博客-CSDN博客 1. 摘要 相比OpenAI的…

背包问题DP(01背包 完全背包 多重背包 分组背包)

目录 背包问题的简介背包问题的定义背包问题的分类 01背包问题典型例题实现思路二维数组代码实现一维数组优化实现扩展:记忆化搜索 DPS 实现 01背包之恰好装满思路代码实现 完全背包问题典型例题思路分析二维数组代码实现一维数组优化实现 多重背包问题多重背包问题…

网易一面:单节点2000Wtps,Kafka怎么做的?

说在前面 在40岁老架构师 尼恩的读者交流群(50)中,最近有小伙伴拿到了一线互联网企业如网易、有赞、希音、百度、网易、滴滴的面试资格,遇到一几个很重要的面试题: 问题1:单节点2000Wtps,Kafka高性能原理是什么&#…

测试人员如何通过AI提高工作效率!

随着AI技术的兴起,像OpenAI推出的ChatGPT、Microsoft发布的Microsoft 365 Copilot、阿里的通义千问、百度的文心一言、华为的盘古大模型等。很多测试人员开始担心,岗位是否会被AI取代?其实取代你的不是AI,而是会使用AI的测试人&am…

[论文分享]VOLO: Vision Outlooker for Visual Recognition

VOLO: Vision Outlooker for Visual Recognition 概述 视觉 transformer(ViTs)在视觉识别领域得到了广泛的探索。由于编码精细特征的效率较低,当在 ImageNet 这样的中型数据集上从头开始训练时,ViT 的性能仍然不如最先进的 CNN。…

解密长短时记忆网络(LSTM):从理论到PyTorch实战演示

目录 1. LSTM的背景人工神经网络的进化循环神经网络(RNN)的局限性LSTM的提出背景 2. LSTM的基础理论2.1 LSTM的数学原理遗忘门(Forget Gate)输入门(Input Gate)记忆单元(Cell State)…

【洛谷】P1678 烦恼的高考志愿

原题链接:https://www.luogu.com.cn/problem/P1678 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 将每个学校的分数线用sort()升序排序,再二分查找每个学校的分数线,通过二分找到每个同学估分附近的分数线。 最后…

【Java】对象与类

【Java】对象与类 文章目录 【Java】对象与类1、学习背景2、定义&使用2.1 创建类2.2 创建对象 3、static关键字3.1 修饰变量3.2 修饰方法3.3 修饰代码块3.4 修饰内部类 4、this关键字5、封装特性5.1 访问修饰符5.2 包的概念 6、构造方法7、代码块7.1 普通代码块7.2 成员代码…

信息安全:入侵检测技术原理与应用.(IDS)

信息安全:入侵检测技术原理与应用. 入侵检测是网络安全态势感知的关键核心技术,支撑构建网络信息安全保障体系。入侵是指违背访问目标的安全策略的行为。入侵检测通过收集操作系统、系统程序、应用程序、网络包等信息,发现系统中违背安全策略…

无公网IP内网穿透使用vscode配置SSH远程ubuntu随时随地开发写代码

文章目录 前言1、安装OpenSSH2、vscode配置ssh3. 局域网测试连接远程服务器4. 公网远程连接4.1 ubuntu安装cpolar内网穿透4.2 创建隧道映射4.3 测试公网远程连接 5. 配置固定TCP端口地址5.1 保留一个固定TCP端口地址5.2 配置固定TCP端口地址5.3 测试固定公网地址远程 前言 远程…

【QT5-自我学习-线程qThread移植与使用-通过代码完成自己需要功能-移植小记3】

【QT5-自我学习-线程qThread移植与使用-通过代码完成自己需要功能-移植小记3】 1、前言2、实验环境3、自我总结(1)文件的编写(2)信号与槽的新理解(3)线程数据的传递 4、移植步骤第一步:添加新文…

在Linux系统上安装和配置Redis数据库,无需公网IP即可实现远程连接的详细解析

文章目录 1. Linux(centos8)安装redis数据库2. 配置redis数据库3. 内网穿透3.1 安装cpolar内网穿透3.2 创建隧道映射本地端口 4. 配置固定TCP端口地址4.1 保留一个固定tcp地址4.2 配置固定TCP地址4.3 使用固定的tcp地址连接 Redis作为一款高速缓存的key value键值对的数据库,在…

React组件间数据传递(弹框和高阶组件(HOC)特性实现)

前言 在现代前端开发中,React 已经成为了最受欢迎的 JavaScript 库之一。而在复杂的应用中,不同组件之间的数据传递问题显得尤为关键。在本文中,我们将探讨一种高效的方法,即如何利用弹框和高阶组件特性来实现 React 组件间的数据…

vue3 基础知识 ( webpack 基础知识)05

你好 文章目录 一、组件二、如何支持SFC三、webpack 打包工具四、webpack 依赖图五、webpack 代码分包 一、组件 使用组件中我们可以获得非常多的特性: 代码的高亮;ES6、CommonJS的模块化能力;组件作用域的CSS;可以使用预处理器来…

芯片行业震荡期,数字后端还可以入吗?

自去年开始,芯片行业仿佛进入了动荡期,经历了去年秋招和今年春招的小伙伴都知道,如今找工作有多难。 半导体行业人才缩减、各大厂裁员,在加上高校毕业生人数破千万,对于即将踏入IC这个行业的应届生来说,今…

存储过程的使用

一、实验目的 熟练掌握使用 SQL SERVER 2000 创建和执行存储过程的方法。 熟练掌握存储过程的删除操作。 二、实验准备 1.熟悉 SQL SERVER 2000 设计环境; 2.熟悉存过过程的创建方法、步骤 三、实验内容 1、利用企业管理器或查询分析器…

在线OJ平台项目

一、项目源码 Online_Judge yblhlk/Linux课程 - 码云 - 开源中国 (gitee.com) 二、所用技术与开发环境 1.所用技术: MVC架构模式 (模型-视图-控制器) 负载均衡系统设计 多进程、多线程编程 C面向对象编程 & C 11 & STL 标准库 C Boost 准标…

建议收藏|软考机构推荐看这一篇就够了

需要最近因为软考改革成机考,大家都在问还有没有必要找机构学?本来已经进入自学阶段的考生,也纷纷开始慌张机考改革会不会影响考试难度?今天胖圆给大家总结一下软考要不要报机构?市面上的软考培训机构如何选择&#xf…

高手速成|数据库脚本生成工具

高手速成|数据库脚本生成工具 文章目录 高手速成|数据库脚本生成工具前言1、软件的安装及使用2、建立新工程3、创建Conceptual Data Model(概念数据模型)4、将E-R图转化为其他数据库模型5、导出DBMS代码(Sql执行脚本)6、执行sql脚…