本文介绍 Java 语言实现 MD5 Hash 的多种方法。
目录
- MD5 简介
- 实现方法
- 基于 Java API
- 基于 Apache Commons
- 基于 Google Guava
- 基于 Spring Framework Util
- 单元测试
MD5 简介
MD5(Message-Digest Algorithm)是一种广泛使用的密码散列函数,可产生 128 位(16 字节)的散列值,用于确保信息传输完整一致。
实现方法
基于 Java API
package tutorial.java.util;
import javax.xml.bind.DatatypeConverter;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class Md5Utils {
/**
* Hash 文本字符串
*
* @param original 原文
* @return Hash 结果
*/
public static String md5(String original) throws NoSuchAlgorithmException {
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
messageDigest.update(original.getBytes(StandardCharsets.UTF_8));
byte[] digest = messageDigest.digest();
return DatatypeConverter.printHexBinary(digest);
}
/**
* Hash 文件
*
* @param filePath 文件路径
* @return Hash 结果
*/
public static String md5File(String filePath) throws NoSuchAlgorithmException, IOException {
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
messageDigest.update(Files.readAllBytes(Paths.get(filePath)));
byte[] digest = messageDigest.digest();
return DatatypeConverter.printHexBinary(digest);
}
}
基于 Apache Commons
- 添加 Apache Commons Codec 依赖
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.14</version>
</dependency>
- 使用
org.apache.commons.codec.digest.DigestUtils
实现 MD5 Hash
package tutorial.java.util;
import org.apache.commons.codec.digest.DigestUtils;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class Md5Utils {
/**
* Hash 文本字符串
*
* @param original 原文
* @return Hash 结果
*/
public static String md5(String original) {
return DigestUtils.md5Hex(original);
}
/**
* Hash 文件
*
* @param filePath 文件路径
* @return Hash 结果
*/
public static String md5File(String filePath) throws IOException {
try (InputStream inputStream = new FileInputStream(filePath)) {
return DigestUtils.md5Hex(inputStream);
}
}
}
基于 Google Guava
- 添加 Google Guava 依赖
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>28.2-jre</version>
</dependency>
- 使用
com.google.common.hash.Hashing
实现 MD5 Hash
package tutorial.java.util;
import com.google.common.hash.Hashing;
import com.google.common.io.Files;
import java.io.File;
import java.io.IOException;
public class Md5Utils {
/**
* Hash 文本字符串
*
* @param original 原文
* @return Hash 结果
*/
public static String md5(String original) {
return Hashing.md5().hashBytes(original.getBytes()).toString();
}
/**
* Hash 文件
*
* @param filePath 文件路径
* @return Hash 结果
*/
public static String md5File(String filePath) throws IOException {
return Files.asByteSource(new File(filePath)).hash(Hashing.md5()).toString();
}
}
注意:Hashing.md5()
是过期方法,Google Guava API 文档中说明是因安全性问题应尽量避免直接使用 MD5,但如有需要也可以继续使用。
基于 Spring Framework Util
- 添加 Spring Framework Core 依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
- 使用
org.springframework.util.DigestUtils
实现 MD5 Hash
package tutorial.java.util;
import org.springframework.util.DigestUtils;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class Md5Utils {
/**
* Hash 文本字符串
*
* @param original 原文
* @return Hash 结果
*/
public static String md5(String original) {
return DigestUtils.md5DigestAsHex(original.getBytes());
}
/**
* Hash 文件
*
* @param filePath 文件路径
* @return Hash 结果
*/
public static String md5File(String filePath) throws IOException {
try (InputStream inputStream = new FileInputStream(filePath)) {
return DigestUtils.md5DigestAsHex(inputStream);
}
}
}
单元测试:
适用于以上所有示例代码。
package tutorial.java.util;
import org.junit.Assert;
import org.junit.Test;
import java.io.IOException;
import java.security.NoSuchAlgorithmException;
public class Md5UtilsTest {
@Test
public void testMd5() throws NoSuchAlgorithmException {
String original = "ABCDEFG";
String expected = "bb747b3df3130fe1ca4afa93fb7d97c9";
Assert.assertTrue(expected.equalsIgnoreCase(Md5Utils.md5(original)));
}
@Test
public void testMd5File() throws NoSuchAlgorithmException, IOException {
// 注意修改成本地测试文件
String filePath = "D:\\Temp\\test.pdf";
String expected = "A4C4E2DC68A7E61D6FA19F9B1091AAED";
Assert.assertTrue(expected.equalsIgnoreCase(Md5Utils.md5File(filePath)));
}
}
网友评论