本文以 JDK 1.5 為基礎,通過完整代碼示例演示 Java 加密體系的四大支柱:消息摘要(完整性)、對稱加密(機密性)、非對稱加密(密鑰交換/簽名)、數位簽名(身份驗證/防抵賴)與數位證書(信任鏈)。
單向雜湊函數,常用於密碼存儲、檔案完整性校驗。JDK 提供 MessageDigest 支援 MD5、SHA-1、SHA-256 等演算法。
MessageDigest md = MessageDigest.getInstance("SHA-1");
md.update(plainTextBytes);
byte[] digest = md.digest();
加解密使用同一把密鑰,速度快,適合大量資料。典型演算法:AES(128/192/256 位)、DESede。JDK 透過 KeyGenerator 產生密鑰,Cipher 執行加解密。
KeyGenerator kg = KeyGenerator.getInstance("AES");
kg.init(128);
Key key = kg.generateKey();
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] cipherText = cipher.doFinal(plainText);
密鑰對:公鑰加密 → 私鑰解密(機密性);私鑰加密 → 公鑰解密(簽名)。典型演算法:RSA(JDK 1.5+ 內建支援)。速度較慢,通常僅加密對稱密鑰或摘要。
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(1024);
KeyPair kp = kpg.generateKeyPair();
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE, kp.getPublic());
流程:資料 → 摘要(SHA-1) → 私鑰加密摘要 → 簽名。驗證:公鑰解密簽名得摘要 → 對比重新計算摘要。JDK 使用 Signature 類實現。
Signature sig = Signature.getInstance("SHA1WithRSA");
sig.initSign(privateKey);
sig.update(data);
byte[] signature = sig.sign();
// 驗證
sig.initVerify(publicKey);
sig.update(data);
boolean ok = sig.verify(signature);
解決「公鑰真偽」問題:CA 機構對「身份+公鑰」簽名形成證書。JDK 提供 keytool 管理金鑰庫:
# 產生自簽名證書
keytool -genkey -alias mykey -keyalg RSA -keystore mystore
# 簽名 JAR
jarsigner -keystore mystore app.jar mykey