跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
Javajava算法

Java MD5 加密算法原理与实现

MD5 作为一种常用的杂凑算法,能将任意长度数据转换为固定长度的十六进制串,具备压缩性、易计算性和抗修改性等特点。尽管存在碰撞风险,不再适用于高安全场景,但在基础校验中仍有应用。展示了 Java 中使用 MessageDigest 实现 MD5 的具体代码,并补充说明了简单的异或加密与 MD5 哈希的区别,帮助开发者理解不同加密方式的适用边界。

www发布于 2025/1/19更新于 2026/4/252 浏览
Java MD5 加密算法原理与实现

MD5(Message-Digest Algorithm 5)是一种广泛使用的杂凑算法,主要用于确保信息传输的完整性。它将任意长度的数据运算为固定长度的十六进制字符串,主流编程语言通常都内置了相关实现。MD5 的前身包括 MD2、MD3 和 MD4。

该算法具备以下核心特性:

  • 压缩性:无论输入数据多长,输出的 MD5 值长度始终固定。
  • 易计算性:从原数据生成 MD5 值非常高效。
  • 抗修改性:对原数据的任何微小改动(哪怕仅 1 个字节),都会导致 MD5 值发生巨大变化。
  • 强抗碰撞性:在已知原数据和 MD5 值的情况下,找到具有相同 MD5 值的伪造数据极其困难。不过,随着王小云教授团队提出 MD5 攻击碰撞方案后,现在在主流配置的电脑上几秒钟即可生成内容不同但 MD5 相同的文件。因此,MD5 算法不应再被用于任何软件完整性检查或代码签名的用途。

MD5 的主要作用是在数字签名签署前,将大容量信息'压缩'成保密格式。除了 MD5,常见的还有 SHA-1、RIPEMD 以及 Haval 等。

下面我们通过 Java 代码来看看具体的实现逻辑。需要注意的是,示例中的 convertMD5 方法仅为简单的异或(XOR)演示,并非真正的 MD5 解密(因为 MD5 本身是不可逆的单向哈希)。在实际开发中,请根据场景选择合适的加密方式。

package encrypt;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.security.MessageDigest;

public class MD5Util {
    /**
     * MD5 加码 生成 32 位 md5 码
     */
    public static String string2MD5(String inStr) {
        MessageDigest md5 = null;
        try {
            md5 = MessageDigest.getInstance("MD5");
        } catch (Exception e) {
            System.out.println(e.toString());
            e.printStackTrace();
            return "";
        }
        char[] charArray = inStr.toCharArray();
        byte[] byteArray = new byte[charArray.length];
        for (int i = 0; i < charArray.length; i++) {
            byteArray[i] = (byte) charArray[i];
        }
        byte[] md5Bytes = md5.digest(byteArray);
        StringBuffer hexValue = new StringBuffer();
        for (int i = 0; i < md5Bytes.length; i++) {
            int val = ((int) md5Bytes[i]) & 0xff;
            if (val < 16) {
                hexValue.append("0");
            }
            hexValue.append(Integer.toHexString(val));
        }
        return hexValue.toString();
    }

    /**
     * 简单异或加密/解密演示(非真实 MD5 解密)
     */
    public static String convertMD5(String inStr) {
        char[] a = inStr.toCharArray();
        for (int i = 0; i < a.length; i++) {
            a[i] = (char) (a[i] ^ 't');
        }
        String s = new String(a);
        return s;
    }

    // 测试主函数
    public static void main(String args[]) {
        InputStreamReader reader = new InputStreamReader(System.in);
        BufferedReader br = new BufferedReader(reader);
        String buffer = null;
        try {
            while ((buffer = br.readLine()) != null) {
                if (buffer.equals("exit")) {
                    System.exit(1);
                }
                String s = new String(buffer);
                System.out.println("原始:" + s);
                System.out.println("MD5 后:" + string2MD5(s));
                System.out.println("加密的:" + convertMD5(s));
                System.out.println("解密的:" + convertMD5(convertMD5(s)));
            }
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("出错了。。。");
        }
    }
}

在上面的代码中,string2MD5 方法使用了 MessageDigest 类来获取 MD5 实例。这里有个细节要注意:md5Bytes[i] 是 byte 类型,直接转 hex 可能会因为符号位变成负数,所以必须用 & 0xff 将其转换为无符号整数,这样才能正确拼接十六进制字符串。convertMD5 则通过异或操作实现了简单的加解密效果,适合做轻量级混淆,但不具备密码学安全性。

  • 💰 8折买阿里云服务器限时8折了解详情
  • 💰 8折买阿里云服务器限时8折购买
  • 🦞 5分钟部署阿里云小龙虾了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog

更多推荐文章

查看全部
  • 热门开源微服务框架与 Service Mesh 选型参考
  • 华为 OD 机试:小朋友分组最少调整次数 (Java)
  • 华为 OD 机试:二维伞雨滴效应的 BST 验证与实现
  • Django 模型核心方法与进阶用法详解
  • Python 调用通义千问 Qwen2.5 模型完整流程
  • DIAMOND 基因序列快速比对工具使用及超算集群并行计算指南
  • Java 并发性能优化:如何避免伪共享
  • Linux 下 Java JAR 包后台运行与端口检查实战
  • 测试驱动开发(TDD)核心流程与 Java 实战
  • PyTorch JIT 与 TorchScript:实测推理性能提升 50%
  • MySQL Range 分区实战:解决千万级数据查询性能瓶颈
  • Linux 基础命令与文件操作实战笔记
  • 图对比学习综述(一):对比范式与优化目标
  • Shell 脚本中 date 命令常用技巧与实战
  • SpringBoot 集成 MyBatis-Plus Dynamic-Datasource 实现主从多数据源
  • 串的数据结构定义与 C 语言堆分配存储实现
  • PHP 接口开发:XML 数据的生成与解析实战
  • Office 区域限制导致 Copilot 无法使用的解决方案
  • LLaMA-Factory 大模型微调技术背景与流程
  • 汇川机器人软件 RobotLab 常规操作

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online