Java实现md5加密

目录

1、简介

2、Java实现

apache

Java

Spring

完整代码


🍃作者介绍:双非本科大三网络工程专业在读,阿里云专家博主,专注于Java领域学习,擅长web应用开发、数据结构和算法,初步涉猎Python人工智能开发和前端开发。
🦅主页:@逐梦苍穹

📕您的一键三连,是我创作的最大动力🌹

1、简介

MD5(Message Digest Algorithm 5)是一种常用的哈希函数,广泛用于对数据进行加密和验证完整性。

它产生的哈希值通常是一个128位的16进制数字,通常表示为32个字符的字符串。

MD5 算法的主要特点包括不可逆性、固定长度输出和对输入敏感。

下面是 MD5 加密的基本原理:

  1. 不可逆性: MD5 是一种单向哈希函数,意味着无法从 MD5 哈希值还原出原始数据。即使是微小的数据变化,也会导致相当大的哈希值变化。
  2. 固定长度输出: MD5 始终产生固定长度的输出,即128位,无论输入数据的大小是多少。
  3. 对输入敏感: 即使输入数据仅有微小的变化,MD5 哈希值也会有显著的不同。这使得 MD5 适用于验证数据的完整性,因为任何数据的修改都会导致哈希值的变化。

尽管 MD5 在许多方面是有效的,但它也存在一些安全性问题。由于其固定长度输出和演算法特性,MD5 存在碰撞问题,即两个不同的输入可以生成相同的 MD5 哈希值。因此,MD5 在安全敏感的场景中已经被认为不够安全,不建议用于密码存储等需要高度安全性的用途。

在实际应用中,为了提高安全性,推荐使用更安全的哈希算法,如SHA-256或SHA-3。这些算法提供更大的输出空间,更高的安全性,并且在当前技术水平下更难受到攻击。

2、Java实现

这里介绍三种Java实现md5加密的方式

apache

Java

这种方式不借助第三方,使用Java自带的工具包:

import java.nio.charset.StandardCharsets;

import java.security.MessageDigest;

这里需要自己编写一个工具类ByteUtils来实现字节数组转换为字符串:

Spring

在开发中最常用的还是spring提供的包。

测试

完整代码

ByteUtils:

package com.xzl.md5;

import org.apache.commons.codec.binary.Hex;

public class ByteUtils {

    // 将字节数组转换为十六进制字符串
    public static String toHexString(byte[] bytes) {
        return Hex.encodeHexString(bytes);
    }

    // 将十六进制字符串转换为字节数组
    public static byte[] fromHexString(String hexString) {
        try {
            return Hex.decodeHex(hexString.toCharArray());
        } catch (Exception e) {
            throw new RuntimeException("Failed to convert hex string to byte array", e);
        }
    }
}

Md5Utils:

package com.xzl.md5;

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;

/**
 * @author 逐梦苍穹
 * @date 2024/1/28 17:31
 */
public class Md5Utils {
    /**
     * org.apache.commons.codec.digest.DigestUtils
     */
    public static String encryptToMd5(String str) {
        return org.apache.commons.codec.digest.DigestUtils.md5Hex(str);
    }

    /**
     * java加密
     */
    public static String encrypt2ToMd5(String str) {

        // 加密后的16进制字符串
        String hexStr = "";
        try {

            // 此 MessageDigest 类为应用程序提供信息摘要算法的功能
            MessageDigest md5 = MessageDigest.getInstance("MD5");
            // 转换为MD5码
            byte[] digest = md5.digest(str.getBytes(StandardCharsets.UTF_8));
            hexStr = ByteUtils.toHexString(digest);
        } catch (Exception e) {

            e.printStackTrace();
        }
        return hexStr;
    }

    /**
     * org.springframework.util.DigestUtils
     */
    public static String encrypt3ToMd5(String str) {
        return org.springframework.util.DigestUtils.md5DigestAsHex(str.getBytes(StandardCharsets.UTF_8));
    }
}

test:

package com.xzl.md5;

/**
 * @author 逐梦苍穹
 * @date 2024/1/28 17:46
 */
public class test {
    public static void main(String[] args) {
        String str = "123456";
        System.out.println("MD5加密方法一:" + Md5Utils.encryptToMd5(str));
        System.out.println("MD5加密方法二:" + Md5Utils.encrypt2ToMd5(str));
        System.out.println("MD5加密方法三:" + Md5Utils.encrypt3ToMd5(str));
    }
}

最后,记得导入坐标,这是pom.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.xzl</groupId>
    <artifactId>SpringBootTestCode</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>SpringBootTestCode</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>17</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.7.3</spring-boot.version>
        <commons-codec.version>1.15</commons-codec.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
        </dependency>

    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <dependency>
                <groupId>commons-codec</groupId>
                <artifactId>commons-codec</artifactId>
                <version>${commons-codec.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>17</source>
                    <target>17</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
                <configuration>
                    <mainClass>com.xzl.SpringBootTestCodeApplication</mainClass>
                    <skip>true</skip>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逐梦苍穹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值