目录
🍃作者介绍:双非本科大三网络工程专业在读,阿里云专家博主,专注于Java领域学习,擅长web应用开发、数据结构和算法,初步涉猎Python人工智能开发和前端开发。
🦅主页:@逐梦苍穹📕您的一键三连,是我创作的最大动力🌹
1、简介
MD5(Message Digest Algorithm 5)是一种常用的哈希函数,广泛用于对数据进行加密和验证完整性。
它产生的哈希值通常是一个128位的16进制数字,通常表示为32个字符的字符串。
MD5 算法的主要特点包括不可逆性、固定长度输出和对输入敏感。
下面是 MD5 加密的基本原理:
- 不可逆性: MD5 是一种单向哈希函数,意味着无法从 MD5 哈希值还原出原始数据。即使是微小的数据变化,也会导致相当大的哈希值变化。
- 固定长度输出: MD5 始终产生固定长度的输出,即128位,无论输入数据的大小是多少。
- 对输入敏感: 即使输入数据仅有微小的变化,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>