Java MD5消息摘要算法原理及实现代码

当然,以下将按照Markdown的规范进行回答。

Java MD5消息摘要算法原理及实现代码

算法原理

MD5(Message-Digest algorithm 5)消息摘要算法是一种广泛使用的密码哈希函数,用于在计算机系统中对信息进行加密。MD5算法可以将任意长度的消息压缩成一个128位的哈希值,通常用于验证消息的完整性和一致性。

MD5算法的实现原理可以简单概括为以下四个步骤:

  1. 附加填充位

在消息的末尾填充比特串,使得消息的长度满足一个特定的长度要求。比如,在MD5算法中,每个消息块的大小为512位,因此需要在消息末尾添加填充位,使得消息长度为512的倍数。

  1. 初始化缓冲区

将五个32位数(A、B、C、D、E)初始化为固定常量。这五个数每个数都是由前一个数通过一定的计算方法得到的。

  1. 处理消息块

对于每个长度为512位的消息块,执行一定的计算操作,更新缓冲区中的五个数。

  1. 输出结果

将缓冲区中的五个数连接起来,按照一定的规则组成128位的哈希值,作为最终的输出结果。

Java代码示例

下面给出一个简单的Java代码示例,展示如何使用Java自带的MessageDigest类来进行MD5算法的加密。

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MD5Demo {
    public static void main(String[] args) {
        String input = "Hello, World!";
        byte[] inputBytes = input.getBytes();

        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] outputBytes = md.digest(inputBytes);

            System.out.println("Input: " + input);
            System.out.println("MD5 Hash: " + bytesToHex(outputBytes));
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
    }

    private static final char[] HEX_ARRAY = "0123456789ABCDEF".toCharArray();

    private static String bytesToHex(byte[] bytes) {
        char[] hexChars = new char[bytes.length * 2];
        for (int i = 0; i < bytes.length; i++) {
            int v = bytes[i] & 0xFF;
            hexChars[i * 2] = HEX_ARRAY[v >>> 4];
            hexChars[i * 2 + 1] = HEX_ARRAY[v & 0x0F];
        }
        return new String(hexChars);
    }
}

在这个示例中,我们先定义了一个字符串input,然后将它转化为字节数组inputBytes。接着,我们使用Java自带的MessageDigest类生成一个MD5消息摘要对象md,并将inputBytes传入其中进行计算。计算完成后,得到的消息摘要结果被转换为一个字节数组outputBytes。最后,我们使用bytesToHex方法将字节数组转换为十六进制字符串,并打印出来。

示例输出结果为:

Input: Hello, World!
MD5 Hash: 86FB269D190D2C85F6E0468CECA42A20

这个示例展示了如何使用Java自带的MessageDigest类进行MD5加密操作。需要注意的是,在使用MessageDigest类时,还需要处理一些异常情况,比如NoSuchAlgorithmException。处理异常的代码已经包含在示例中。

下面给出另一个示例,展示更完整的代码实现。

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MD5 {
    private static final int[] SHIFT_AMOUNTS = { 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 };
    private static final int[] CONSTANTS = new int[64];
    private static final String HEX_ARRAY = "0123456789ABCDEF";

    static {
        for (int i = 0; i < CONSTANTS.length; i++) {
            CONSTANTS[i] = (int) (Math.pow(2, 32) * Math.abs(Math.sin(i + 1)));
        }
    }

    public static String hash(String input) throws NoSuchAlgorithmException {
        byte[] inputBytes = input.getBytes();

        MessageDigest md = MessageDigest.getInstance("MD5");
        md.update(inputBytes);

        byte[] digest = md.digest();

        StringBuilder hexString = new StringBuilder();
        for (byte b : digest) {
            hexString.append(byteToHex(b));
        }

        return hexString.toString();
    }

    private static String byteToHex(byte b) {
        int unsigned = b & 0xFF;
        return HEX_ARRAY.charAt(unsigned >>> 4) + "" + HEX_ARRAY.charAt(unsigned & 0x0F);
    }
}

这个示例中,我们定义了一个类MD5,并实现了一个静态方法hash,用于接收原始字符串输入,并返回MD5消息摘要的十六进制字符串表示。在方法中,我们首先将原始字符串转为字节数组inputBytes,然后使用Java自带的MessageDigest类进行MD5消息摘要的计算。计算完成后,得到的结果被保存在一个字节数组digest中,我们将其转换为一个十六进制字符串,并返回作为函数结果。

示例中还定义了两个数组SHIFT_AMOUNTSCONSTANTS,分别保存了MD5算法中需要用到的一些固定参数和计算量,以便于后面的计算操作。

两个示例的实现细节不同,在实际应用时可根据实际需要选择合适的实现方式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java MD5消息摘要算法原理及实现代码 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • 使用java打印心型、圆形图案的实现代码

    以下是使用 Java 打印心型、圆形图案的实现代码攻略。 准备工作 首先,我们需要安装 Java 编程环境。可以在 Oracle 官网 下载 JDK,并按照官方文档进行安装。安装完成后,我们需要选择一款编辑器或者 IDE 来编写代码,常用的有 IntelliJ IDEA、Eclipse、VS Code等。 打印心型图案 要打印心型图案,我们可以使用嵌套循环来…

    Java 2023年5月26日
    00
  • Java设计模式之java组合模式详解

    Java组合模式详解 什么是组合模式? 组合模式是一种结构型设计模式,其主要思想是将对象组合成树形结构以表示“部分整体”的层次结构。组合模式中包含两种基本的组件: 叶节点(Leaf): 叶节点代表树的最底层的节点,即无子节点的节点。 复合节点(Composite): 复合节点代表树的非叶子节点,它可能包含子节点,也可能不包含。 组合模式的优点 可以更方便地扩…

    Java 2023年5月26日
    00
  • JavaSpringBoot报错“ClassNotFoundException”的原因和处理方法

    原因 “ClassNotFoundException” 错误通常是以下原因引起的: 类路径不正确:如果您的类路径不正确,则可能会出现此错误。在这种情况下,需要检查您的类路径并确保它们正确。 缺少依赖项:如果您的依赖项缺失,则可能会出现此错误。在这种情况下,需要检查您的依赖项并确保它们存在。 解决办法 以下是解决 “ClassNotFoundException…

    Java 2023年5月4日
    00
  • Spring Boot 教程之创建项目的三种方式

    下面是关于”Spring Boot教程之创建项目的三种方式”的攻略: 创建Spring Boot项目的三种方式 Spring Boot提供了三种方式来创建新的Spring Boot应用程序: 使用Spring Initializr 使用Spring Boot CLI 使用Spring Tool Suite 接下来我们将一一讲解这三种方式的具体步骤。 使用Sp…

    Java 2023年5月15日
    00
  • jsp实现页面实时显示当前系统时间的方法

    要实现页面实时显示当前系统时间,可以使用以下方法: 方法一:使用JavaScript实现 最简单的方法是使用JavaScript,这种方式可以通过浏览器直接获取当前时间,然后展示在页面上。具体实现如下: 在HTML页面中引入JavaScript代码: <body onload="setInterval(displayClock, 1000);…

    Java 2023年6月15日
    00
  • springsecurity基于token的认证方式

    下面我将详细讲解一下“Spring Security基于Token的认证方式”的完整攻略。 什么是Token认证方式 Token认证方式,是一种基于令牌(Token)的身份认证方式。在客户端成功登录后,服务端会生成一个Token,这个Token会放到HTTP响应头中或者响应体中返回给客户端,客户端需要在后续的请求中携带该Token才能访问资源。 Token认…

    Java 2023年5月20日
    00
  • Android通过HttpURLConnection和HttpClient接口实现网络编程

    Android通过HttpURLConnection和HttpClient接口实现网络编程 Android平台提供了两种网络编程接口:HttpURLConnection和HttpClient。使用它们可以很容易地进行网络通信,发送请求,接收和解析服务器的响应。 HttpURLConnection接口 HttpURLConnection是Android平台中的…

    Java 2023年6月15日
    00
  • Swagger JSON高危漏洞被发现 Java/PHP/NodeJS/Ruby或中招

    标题: 全方位防范 Swagger JSON 高危漏洞 背景介绍: 最近,一种针对 Swagger JSON 文件的高危漏洞被发现,这种漏洞可能让攻击者直接获取到应用程序的代码。这种漏洞已经影响到了 Java、PHP、NodeJS、Ruby 等多种语言,因此我们需要对此进行有效的防范。 攻击过程: 攻击者可能会通过修改Swagger文档,添加恶意逻辑来执行以…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部