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

MD5 Java Bean 完整實作:從 RFC 1321 到跨平台可重用元件

     編輯:Java 相關知識

MD5 演算法簡介

MD5 (Message-Digest Algorithm 5) 由 MIT 與 RSA Data Security 設計,將任意長度位元組串列轉換為 128-bit (32 字元十六進位) 雜湊值。特性:

  • 單向性:不可逆推原始資料
  • 雪崩效應:輸入微小變化導致輸出劇烈不同
  • 固定長度:無論輸入長短,輸出恆為 128-bit

典型應用場景

實作策略:Pure Java vs JNI

作者選擇 Pure Java 移植 C 參考實作 (RFC 1321),理由:

  • 避免 JNI 引入平台相依性,破壞「Write Once, Run Anywhere」
  • 驗證 Java 2 效能是否足以支撐密集位元運算
  • 原始碼可讀性、維護性優於 JNI 混合模式

關鍵技術轉換點

1. 無符號整數處理

C 語言 unsigned long (32-bit) → Java int (32-bit 有符號) + long (64-bit) 避免溢位


// C: unsigned long a, b, c; c = a + b;
// Java: 需用 long 儲存中間結果防溢位
long a = ..., b = ...;
long c = a + b;
int result = (int) c; // 取低 32 位

2. 位元運算對應

場景說明
檔案完整性驗證下載檔案對比 MD5 指紋,防篡改
密碼儲存資料庫存 MD5 雜湊而非明文,駭客入侵也無法直接得知密碼
數位簽名搭配非對稱加密,實現防抵賴
快取鍵值長字串轉短固定鍵,如 URL 縮短、查詢快取
C 運算Java 運算說明
a << na << n左移相同
a >> n (unsigned)a >>> nJava 無符號右移用 >>>
a & ba & b位元 AND
a | ba | b位元 OR
a ^ ba ^ b位元 XOR
~a~a位元 NOT

3. 宏定義轉換


// C: #define F(x,y,z) ((x & y) | (~x & z))
// Java: final static 方法
private static int F(int x, int y, int z) {
    return (x & y) | (~x & z);
}

測試驗證 (RFC 1321 Test Suite)


MD5 ("") = d41d8cd98f00b204e9800998ecf8427e
MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661
MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72
MD5 ("message digest") = f96b697d7cb7938d525a2f31aaf161d0
MD5 ("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b

編譯執行:javac -d . MD5.java && java beartool.MD5,輸出與標準測試向量完全一致。

跨平台驗證

將 MD5.class 複製至 Linux + IBM JDK 1.3 環境執行,結果相同,確認「一次編寫,到處執行」特性。

效能觀察

Java 版 MD5 計算「一閃即完成」,肉眼無法察覺比 C 版慢。JDK 1.3 JIT 編譯器已能有效優化密集整數運算迴路。

Java Bean 封裝與使用

目錄結構


beartool/
└── MD5.class

應用程式中使用


import beartool.MD5;

public class PasswordService {
    public String hashPassword(String plain) {
        MD5 md5 = new MD5();
        md5.update(plain.getBytes());
        return md5.getHashHex(); // 取得 32 字元十六進位字串
    }
    
    public boolean verify(String plain, String storedHash) {
        return hashPassword(plain).equalsIgnoreCase(storedHash);
    }
}

打包部署

  • 保持 beartool/MD5.class 相對路徑
  • 打入應用 .jar 或 .war
  • 或獨立打包為 md5-bean.jar 供多專案共用

安全性補充:現代密碼雜湊建議

⚠️ MD5 已不適合密碼儲存!

  • MD5 速度極快,利於 GPU 並行暴力破解 (每秒十億次)
  • 已知碰撞攻擊,無法抵禦精心構造的惡意輸入
  • 現代標準:bcrypt、scrypt、Argon2、PBKDF2 (刻意設計慢速、可配置工作因子)
  • Java 實作建議:Spring Security BCryptPasswordEncoder 或 BouncyCastle

結語

本文展示從 RFC 1321 參考 C 代碼移植 Pure Java MD5 Bean 的完整過程,驗證了 Java 跨平台特性與運算效能。雖然 MD5 在密碼學應用上已退役,但其演算法移植技巧(無符號模擬、位元運算對應、測試向量驗證)對實作其他雜湊函數(SHA 系列)、加密演算法極具參考價值。

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