0
点赞
收藏
分享

微信扫一扫

Java 实现 MD5

本文介绍 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
  1. 添加 Apache Commons Codec 依赖
<dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.14</version>
</dependency>
  1. 使用 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
  1. 添加 Google Guava 依赖
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>28.2-jre</version>
</dependency>
  1. 使用 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
  1. 添加 Spring Framework Core 依赖
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>5.2.5.RELEASE</version>
</dependency>
  1. 使用 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)));
    }
}
举报

相关推荐

0 条评论