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

Java 消息摘要算法實戰:MessageDigest 實現 MD5/SHA 加密完整指南與十六進制輸出技巧

     編輯:Java 程式設計入門

核心 API 流程

  1. MessageDigest.getInstance("MD5") 獲取實例(工廠模式);
  2. update(byte[]) 輸入數據(可多次調用累積);
  3. digest() 完成計算,返回字節數組(16 字節 MD5,20 字節 SHA-1);
  4. 字節數組轉十六進制字符串輸出。

完整代碼實現

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

public class DigestUtil {
    public static String md5(String input) {
        return digest(input, "MD5");
    }
    public static String sha1(String input) {
        return digest(input, "SHA-1");
    }
    public static String sha256(String input) {
        return digest(input, "SHA-256");
    }

    private static String digest(String input, String algo) {
        try {
            MessageDigest md = MessageDigest.getInstance(algo);
            md.update(input.getBytes(StandardCharsets.UTF_8));
            byte[] hash = md.digest();
            return toHex(hash);
        } catch (NoSuchAlgorithmException e) {
            throw new IllegalStateException("JVM 缺少算法: " + algo, e);
        }
    }

    private static String toHex(byte[] bytes) {
        StringBuilder sb = new StringBuilder(bytes.length * 2);
        for (byte b : bytes) {
            sb.append(String.format("%02x", b));
        }
        return sb.toString();
    }

    public static void main(String[] args) {
        System.out.println(md5("abc")); // 900150983cd24fb0d6963f7d28e17f72
    }
}

關鍵技術點

  • 工廠模式:MessageDigest 構造器 protected,必須用 getInstance;
  • 編碼顯式化:getBytes(StandardCharsets.UTF_8) 避免平台差異;
  • 十六進制轉換:String.format("%02x", b) 或位運算 (b & 0xFF) 保證無符號;
  • 流式處理:大文件可 update(buf, 0, len) 分塊,無需全量載入內存。

常用算法對比

算法輸出長度安全性適用場景
MD5128 bit (32 hex)已破解(碰撞攻擊)文件完整性校驗、非安全場景
SHA-1160 bit (40 hex)理論脆弱Git 提交 ID、漸進式遷移
SHA-256256 bit (64 hex)強數字簽名、區塊鏈、密碼鹽值
SHA-512512 bit (128 hex)極強高安全需求、長期有效性

安全最佳實踐

  1. 密碼存儲:禁用 MD5/SHA,必須用 BCrypt、PBKDF2、Argon2 等慢哈希 + 隨機鹽;
  2. 文件校驗:SHA-256 平衡性能與安全;
  3. 簽名驗證:配合 RSA/ECDSA 非對稱加密,Signature 類實現;
  4. 防長度擴展攻擊:HMAC (Mac.getInstance("HmacSHA256")) 替代單純哈希。

性能優化

  • 實例復用:MessageDigest 非線程安全,用 ThreadLocal 或每次新建;
  • 硬件加速:現代 CPU 支援 SHA-NI 指令集,JVM 自動利用;
  • 避免頻繁創建 StringBuilder:靜態編譯正則或預分配容量。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved