首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java 計算 MD5 兩大主流方案:原生 MessageDigest 與 Apache Commons Codec 實戰對比

     編輯:Java 程式設計入門

MD5(Message Digest Algorithm 5)雖不再適合密碼學安全場景,但在文件完整性校驗、緩存 Key 生成、非敏感數據指紋等領域仍廣泛使用。本文詳解 JDK 原生與 Apache Commons Codec 兩種實現方式,附生產級封裝建議。

方案一:JDK 原生 MessageDigest(零依賴)

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class Md5Native {
    private static final char[] HEX_DIGITS = 
        {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};

    public static String md5Hex(String input) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] digest = md.digest(input.getBytes(StandardCharsets.UTF_8));
            return bytesToHex(digest);
        } catch (NoSuchAlgorithmException e) {
            throw new IllegalStateException("MD5 算法不可用", e);
        }
    }

    private static String bytesToHex(byte[] bytes) {
        char[] chars = new char[bytes.length * 2];
        for (int i = 0; i < bytes.length; i++) {
            int v = bytes[i] & 0xFF;
            chars[i * 2]     = HEX_DIGITS[v >>> 4];
            chars[i * 2 + 1] = HEX_DIGITS[v & 0x0F];
        }
        return new String(chars);
    }
}

優點:零第三方依賴、JDK 內置。
缺點:樣板代碼多、需手寫十六進制轉換、易出錯。

方案二:Apache Commons Codec(一行代碼)

Maven 依賴:

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

調用代碼:

import org.apache.commons.codec.digest.DigestUtils;

String md5 = DigestUtils.md5Hex("baidu.com"); // 一行搞定
// 輸出:a3b1c2d4e5f6... (32位十六進制小寫)

優點:API 極簡、內部優化、支持流式計算大文件。
缺點:引入額外 JAR(約 300KB)。

進階:大文件流式計算(避免 OOM)

// Commons Codec 支持 InputStream 直接計算
try (FileInputStream fis = new FileInputStream("large-file.zip")) {
    String fileMd5 = DigestUtils.md5Hex(fis);
}

// 原生寫法需手動分塊讀取更新
MessageDigest md = MessageDigest.getInstance("MD5");
try (FileInputStream fis = new FileInputStream("large-file.zip")) {
    byte[] buffer = new byte[8192];
    int len;
    while ((len = fis.read(buffer)) != -1) {
        md.update(buffer, 0, len);
    }
}
String fileMd5 = bytesToHex(md.digest());

安全性警示 ⚠️

  • MD5 已被破解(碰撞攻擊、預像攻擊),嚴禁用於密碼存儲、簽名驗證、安全 Token。
  • 密碼存儲請用 BCrypt、Argon2、PBKDF2(推薦 Spring Security PasswordEncoder)。
  • 文件完整性校驗、緩存 Key、幂等性 Token 等非安全場景可繼續使用。

生產級封裝建議

public final class Md5Utils {
    private Md5Utils() {}

    /** 字符串 MD5(UTF-8) */
    public static String md5Hex(String input) {
        return DigestUtils.md5Hex(input.getBytes(StandardCharsets.UTF_8));
    }

    /** 文件 MD5(流式,大文件安全) */
    public static String md5Hex(File file) throws IOException {
        try (FileInputStream fis = new FileInputStream(file)) {
            return DigestUtils.md5Hex(fis);
        }
    }

    /** 輸入流 MD5(調用者負責關閉流) */
    public static String md5Hex(InputStream is) {
        return DigestUtils.md5Hex(is);
    }
}

總結

新項目首選 Apache Commons Codec,代碼簡潔、維護性強;受限環境無法引入依賴時,用 JDK 原生實現並封裝工具類。切記:MD5 非安全算法,請嚴格限定使用場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved