密碼學是資訊安全的基石,而在 Java 平台上實作加密與數位簽名功能,則是開發者必備的核心技能之一。本文將從基本概念切入,逐步深入至 JDK 1.5 環境下的實際程式碼範例,帶領讀者掌握訊息摘要、對稱式加密與非對稱式加密的關鍵技術。若對密碼學理論有濃厚興趣,強烈推薦研讀 Bruce Schneier 的經典巨著《Applied Cryptography》。
訊息摘要演算法(如 MD5、SHA-1)能將任意長度的輸入資料轉換為固定長度的「數位指紋」。這是單向函數,不可逆向還原原始資料,主要用於驗證資料在傳輸或儲存過程中未被竄改。JDK 1.5 內建支援主流摘要演算法,透過 java.security.MessageDigest 類別即可輕鬆實作。
import java.security.MessageDigest;
public class MessageDigestExample {
public static void main(String[] args) throws Exception {
if (args.length != 1) {
System.err.println("Usage: java MessageDigestExample ");
System.exit(1);
}
byte[] plainText = args[0].getBytes("UTF-8");
// 取得 SHA-1 演算法實例 (160 位元)
MessageDigest md = MessageDigest.getInstance("SHA-1");
System.out.println("Provider: " + md.getProvider().getInfo());
// 更新摘要並輸出結果
md.update(plainText);
System.out.println("Digest: " + new String(md.digest(), "UTF-8"));
}
}
此外,javax.crypto.Mac (Message Authentication Code) 提供了帶金鑰的摘要機制(HMAC),進一步強化資料完整性與來源驗證,有興趣的讀者可自行查閱 API 文件深入研究。
對稱式加密使用相同金鑰進行加密與解密,速度快、適合大量資料處理。常見演算法包含 DES(有效金鑰長度 56 位)、AES(支援 128/192/256 位)、DESede (3DES) 等。JDK 1.5 對這些演算法提供完整支援。核心流程:使用 KeyGenerator 產生金鑰,再透過 Cipher 類別執行加解密操作。
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import java.security.Key;
public class PrivateExample {
public static void main(String[] args) throws Exception {
if (args.length != 1) {
System.err.println("Usage: java PrivateExample ");
System.exit(1);
}
byte[] plainText = args[0].getBytes("UTF-8");
// 1. 產生 AES 金鑰
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(128); // 可指定 128, 192, 256
Key secretKey = keyGen.generateKey();
// 2. 初始化 Cipher 進行加密
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] cipherText = cipher.doFinal(plainText);
System.out.println("Encrypted: " + new String(cipherText, "UTF-8"));
// 3. 解密驗證
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] decryptedText = cipher.doFinal(cipherText);
System.out.println("Decrypted: " + new String(decryptedText, "UTF-8"));
}
}
注意:實際應用中,金鑰的安全分發是對稱加密最大挑戰,這也是非對稱加密(公開金鑰基礎建設 PKI)應運而生的原因。
數位簽名結合了非對稱加密與訊息摘要:簽名者用私鑰對資料摘要加密,驗證者用對應公鑰解密並比對摘要。這同時實現了資料完整性、身分認證與不可抵賴性。Java 透過 java.security.Signature 類別實作(如 SHA1withRSA、SHA256withRSA)。
SecureRandom)。NoSuchAlgorithmException、InvalidKeyException 等檢查型例外。Java 提供了豐富且標準化的密碼學 API (JCA/JCE),讓開發者能專注於業務邏輯而非底層數學實作。掌握本文介紹的核心類別與流程,即可在專案中落實資料加密、完整性校驗與數位簽名功能。安全是一場持久戰,持續關注演算法淘汰時間表與最新漏洞資訊,才是資安工程師的必修課。