核心代碼
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class Md5Util {
/** 字符串 MD5 */
public static String md5(String value) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] digest = md.digest(value.getBytes(StandardCharsets.UTF_8));
return toHex(digest);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return value; // 降級返回原值
}
}
/** 字節數組 MD5 */
public static String md5(byte[] bytes) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] digest = md.digest(bytes);
return toHex(digest);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return "";
}
}
/** 字節數組 → 十六進制字符串 */
private static String toHex(byte[] bytes) {
StringBuilder sb = new StringBuilder(bytes.length * 2);
for (byte b : bytes) {
String hex = Integer.toHexString(b & 0xFF);
if (hex.length() == 1) sb.append('0');
sb.append(hex);
}
return sb.toString();
}
}
關鍵點解析
- UTF-8 顯式編碼:
value.getBytes(StandardCharsets.UTF_8) 避免跨平台亂碼;
- & 0xFF:將有符號 byte 無符號化,保證
0x80~0xFF 正確轉為 80~ff 而非負數十六進制;
- StringBuilder 預分配:容量
bytes.length * 2,避免擴容開銷;
- 異常降級:理論上 JVM 必備 MD5,捕獲異常僅為極端防禦。
使用示例
String s = "hello world";
System.out.println(Md5Util.md5(s)); // 5eb63bbbe01eeed093cb22bb8f5acdc3
System.out.println(Md5Util.md5(s.getBytes())); // 同上
安全提醒
- MD5 已被碰撞攻擊破解,**嚴禁用於密碼存儲、數字簽名、完整性校驗等安全敏感場景**;
- 密碼請用
BCrypt/Argon2/PBKDF2(Spring Security PasswordEncoder);
- 文件完整性校驗建議 SHA-256 或 SHA-3;
- 本工具類僅適用於:非安全業務 Key 生成、緩存 Key、幂等性 Token 等**非抗碰撞**場景。