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

yizhihongxing

当然,以下将按照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日

相关文章

  • jsp hibernate的分页代码第2/3页

    针对“jsp hibernate的分页代码第2/3页”,我将提供以下完整攻略: JSP Hibernate 分页代码攻略 什么是 JSP 分页? JSP 分页是指将大量数据分页展示在网页上,每页展示固定的数据量并提供用户进行翻页查看的方式,以便更好地展示数据和提升用户体验。 基于 Hibernate 的 JSP 分页 Hibernate 是一款开源的 ORM…

    Java 2023年5月31日
    00
  • Spark Streaming编程初级实践详解

    Spark Streaming编程初级实践详解 Spark Streaming是Apache Spark的一个扩展模块,它用于处理实时数据流。在本文中,我们将介绍Spark Streaming编程的基础知识和实践。主要包括以下内容: Spark Streaming简介 Spark Streaming编程基础 实时数据处理应用示例 Spark Streamin…

    Java 2023年6月2日
    00
  • java打印出菱形图案实例详解

    Java 打印出菱形图案实例详解 简介 本文讲解如何在 Java 中打印出菱形图案。 思路分析 要打印出菱形图案,需要先了解菱形的形状。以一个边长为 5 的菱形为例,其形状如下: * *** ***** *** * 菱形由五行组成,分别为: 第一行:一个空格,一个星号 第二行:两个空格,三个星号 第三行:三个空格,五个星号 第四行:两个空格,三个星号 第五行…

    Java 2023年5月26日
    00
  • Java StringBuilder类相关知识总结

    下面是关于Java StringBuilder类的详细讲解攻略。 字符串拼接的问题 在Java中,字符串拼接可以使用+号或者字符串连接方法concat()来实现,示例如下: String str1 = "Hello"; String str2 = "World"; String str3 = str1 + "…

    Java 2023年5月27日
    00
  • SpringMVC基于注解方式实现上传下载

    SpringMVC基于注解方式实现上传下载 SpringMVC是一种基于Java的Web框架,它可以帮助我们快速地开发Web用程序。本文将详细介绍如何使用SpringMVC基于注解方式实现上传下载,并提供两个示例说明。 上传文件 在SpringMVC中,我们可以使用MultipartFile类来处理上传的文件。以下是一个上传文件的示例。 步骤1:配置web.…

    Java 2023年5月17日
    00
  • java实现模仿斗地主发牌

    讲解“Java实现模仿斗地主发牌”的完整攻略,可以分为以下几个步骤: 1. 创建扑克牌对象 为了模仿斗地主发牌,我们需要先创建一副扑克牌的对象。扑克牌通常包含四种花色:方块、梅花、红桃、黑桃;每种花色又有十三种不同的点数,即从 A 到 K 共 13 种。 创建一个 Card 类来表示一张扑克牌,包含属性 suit(花色)和 rank(点数),以及 toStr…

    Java 2023年5月23日
    00
  • Java 双指针项目中的实际应用

    背景说明 最近在做财务相关的系统,对账单核销预付款从技术角度来看就是将两个数组进行合并 对账单核销预付款前提条件: 对账单总金额必须等于未核销金额 数据示例 对账单数据 单号 金额 B0001 100 B0002 80 B0003 120 预付款数据 单号 未核销金额 PRE001 110 PRE002 190 结果数据 预付款单号 核销金额 对账单号 PR…

    Java 2023年5月4日
    00
  • SSM项目频繁打成war包部署,使用tomcat和maven实现热部署配置

    下面是SSM项目频繁打成war包部署并使用tomcat和maven实现热部署配置的完整攻略。 1. 前置条件 在开始之前,确保以下条件已满足: 项目使用maven进行构建 tomcat服务器已正确安装并运行 项目使用spring、spring mvc、mybatis等框架 2. 配置pom.xml文件 在项目的pom.xml文件中添加以下依赖: <de…

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