在資訊安全領域,雜湊算法與非對稱加密是兩大基石。本文透過完整代碼示例,詳細解析 Java 中 MD5、SHA、RSA 三大核心加密算法的實際應用場景與實作細節。
適用場景:密碼儲存驗證、檔案完整性校驗、數位簽名基礎
特點:單向不可逆、定長 128 位輸出、計算速度極快
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5Util {
public static byte[] encrypt(byte[] input) {
try {
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(input);
return md5.digest();
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("MD5 算法不可用", e);
}
}
// 輔助方法:位元組陣列轉十六進制字串
public static String bytesToHex(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
sb.append(String.format("%02x", b));
}
return sb.toString();
}
}
安全提醒:MD5 已被證實存在碰撞漏洞,不建議用於高安全性場景的密碼儲存。現代應用應改用 BCrypt、SCrypt 或 PBKDF2 等慢速雜湊函數。
適用場景:數位憑證、SSL/TLS 協議、區塊鏈、安全性要求較高的完整性校驗
常用變體:SHA-1(160位)、SHA-256(256位)、SHA-512(512位)
public class SHAUtil {
public static byte[] encrypt(byte[] input, String algorithm) {
try {
MessageDigest digest = MessageDigest.getInstance(algorithm);
digest.update(input);
return digest.digest();
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(algorithm + " 算法不可用", e);
}
}
// 使用範例
public static void main(String[] args) {
String data = "Hello Security";
System.out.println("SHA-256: " + bytesToHex(encrypt(data.getBytes(), "SHA-256")));
System.out.println("SHA-512: " + bytesToHex(encrypt(data.getBytes(), "SHA-512")));
}
}
核心優勢:公開金鑰加密、私鑰解密,解決金鑰分發難題
適用場景:敏感資料傳輸、數位簽名、HTTPS 協議、電子郵件加密
import java.security.*;
import javax.crypto.Cipher;
public class RSAUtil {
// 生成金鑰對
public static KeyPair generateKeyPair(int keySize) throws NoSuchAlgorithmException {
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
keyPairGen.initialize(keySize);
return keyPairGen.generateKeyPair();
}
// 公鑰加密
public static byte[] encrypt(PublicKey publicKey, byte[] data) throws Exception {
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
return cipher.doFinal(data);
}
// 私鑰解密
public static byte[] decrypt(PrivateKey privateKey, byte[] encryptedData) throws Exception {
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
return cipher.doFinal(encryptedData);
}
// 完整測試流程
public static void main(String[] args) throws Exception {
// 1. 生成 2048 位金鑰對(現代建議最小規格)
KeyPair keyPair = generateKeyPair(2048);
RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
// 2. 準備明文
String plainText = "機密資料:RSA 加密測試";
byte[] data = plainText.getBytes("UTF-8");
// 3. 加密
byte[] encrypted = encrypt(publicKey, data);
System.out.println("加密後: " + bytesToHex(encrypted));
// 4. 解密
byte[] decrypted = decrypt(privateKey, encrypted);
System.out.println("解密後: " + new String(decrypted, "UTF-8"));
}
private static String bytesToHex(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (byte b : bytes) sb.append(String.format("%02x", b));
return sb.toString();
}
}
| 算法 | 類型 | 金鑰管理 | 性能 | 推薦場景 |
|---|---|---|---|---|
| MD5 | 雜湊 | 無 | 極快 | 非安全性校驗、快速指紋 |
| SHA-256 | 雜湊 | 無 | 快 | 區塊鏈、憑證、完整性驗證 |
| RSA-2048 | 非對稱加密 | 雙鑰 | 慢 | 金鑰交換、數位簽名、小資料加密 |
RSA/ECB/OAEPWithSHA-256AndMGF1Padding,避免使用預設的 PKCS#1 v1.5SecureRandom 而非預設隨機源掌握這三大算法的特性與適用邊界,是構建安全 Java 應用的基礎能力。實際專案中,建議優先使用成熟的安全框架(如 Spring Security、Bouncy Castle)而非手工拼裝加密邏輯。