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

跨平台 MD5 實現大全:Java、MySQL、JavaScript、Oracle 一致性指南

     編輯:Java 程式設計入門

MD5(Message Digest Algorithm 5)雖不再適合密碼學安全場景,但在數據完整性校驗、緩存鍵生成、非敏感指紋等領域仍廣泛使用。跨語言/數據庫環境下,大小寫一致性是最大坑:Java/MySQL/JS 默認小寫十六進制,Oracle 官方包返回大寫。

統一規範

  • 輸出:32 位小寫十六進制字符串
  • 編碼:輸入字符串按 UTF-8 獲取字節
  • 連續多次 MD5:前一次輸出直接作為下一次輸入

驗證向量:

md5("1")           = c4ca4238a0b923820dcc509a6f75849b
md5(md5("1"))      = 28c8edde3d61a0411511d3b1866f0636

1. Java 實現(JDK 內建 MessageDigest)

public class MD5Util {
    public static String md5(String plainText) {
        if (plainText == null) plainText = "";
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] digest = md.digest(plainText.getBytes(StandardCharsets.UTF_8));
            
            StringBuilder sb = new StringBuilder(32);
            for (byte b : digest) {
                sb.append(String.format("%02x", b)); // 自動補零、小寫
            }
            return sb.toString();
        } catch (NoSuchAlgorithmException e) {
            throw new IllegalStateException("MD5 algorithm not available", e);
        }
    }
}

2. MySQL 內建函數

SELECT MD5('1') AS m1, MD5(MD5('1')) AS m2;
/* 結果均為小寫:
m1: c4ca4238a0b923820dcc509a6f75849b
m2: 28c8edde3d61a0411511d3b1866f0636 */

3. JavaScript 純前端實現(無依賴,UMD 規範)

// 核心邏輯:RFC 1321 標準實現,輸出小寫十六進制
const md5 = (function() {
    // ... 完整算法實現(文中提供完整代碼)...
    return function(text) { return hex_md5(text); };
})();

// 使用
console.log(md5("1"));           // c4ca4238a0b923820dcc509a6f75849b
console.log(md5(md5("1")));      // 28c8edde3d61a0411511d3b1866f0636

生產建議:前端用 crypto-js、spark-md5 等成熟庫,支持流式/WebWorker;Node.js 用內建 crypto.createHash('md5')。

4. Oracle 數據庫:必須手動轉小寫

CREATE OR REPLACE FUNCTION MD5(passwd IN VARCHAR2) RETURN VARCHAR2 IS
    retval VARCHAR2(32);
BEGIN
    -- DBMS_OBFUSCATION_TOOLKIT 返回 RAW,轉十六進制後為大寫
    retval := LOWER(RAWTOHEX(DBMS_OBFUSCATION_TOOLKIT.MD5(INPUT_STRING => passwd)));
    RETURN retval;
END;
/

SELECT MD5('1') AS m1, MD5(MD5('1')) AS m2 FROM dual;
/* 結果與 Java/MySQL/JS 完全一致 */

避坑指南

安全提醒:MD5 碰撞攻擊成熟,**嚴禁用於密碼存儲、數字簽名、證書完整性**等安全敏感場景。密碼請用 Argon2/bcrypt/scrypt/PBKDF2;完整性校驗用 SHA-256/SHA-3/BLAKE3;緩存鍵/非關鍵指紋可繼續用 MD5,但建議遷移到更強算法。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
環境默認大小寫處理建議
Java (MessageDigest)小寫直接用
MySQL MD5()小寫直接用
JavaScript (crypto-js等)小寫直接用
Oracle DBMS_OBFUSCATION_TOOLKIT大寫必須 LOWER()
Python hashlib.md5().hexdigest()小寫直接用
Go md5.Sum()小寫fmt.Printf("%x")
.NET MD5.ComputeHash()小寫BitConverter.ToString().Replace("-","").ToLower()