Java 实现 MD5

作者: 又语 | 来源:发表于2020-04-09 15:32 被阅读0次

    本文介绍 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)));
        }
    }
    

    相关文章

      网友评论

        本文标题:Java 实现 MD5

        本文链接:https://www.haomeiwen.com/subject/zqecmhtx.html