經過前二十一天的深入探討,我們從傳統的分組密碼(DES/3DES)、工作模式(ECB/CBC)、金鑰衍生(KDF/HKDF)、訊息認證碼(MAC/HMAC),一路演進至現代工程標準的 AEAD(AES-GCM / ChaCha20-Poly1305)。
在正式邁入非對稱加密(RSA、ECC、Diffie-Hellman)之前,本章將對對稱密碼學進行全面盤點,總結演進脈絡,並列出 Java JCA 開發中最常出現的 10 大致命工程坑點與防範指南。

| 演算法 / 模式 | 機密性 (Confidentiality) | 完整性認證 (Authenticity) | 安全評級 | 現代工程應用建議 |
|---|---|---|---|---|
| AES-ECB | 弱 | 無 | 嚴禁使用 | 明文模式洩漏結構,僅能處理 1 個 Block 的極特殊情境。 |
| AES-CBC | 有 | 無 | 不推薦 | 缺少完整性保護,極易受 Padding Oracle 攻擊;舊系統過渡用。 |
| AES-CBC + HMAC (EtM) | 有 | 有 | 合格 (需極度小心) | 手動組裝模式,工程細節繁瑣,僅在無 AEAD 硬體支援時使用。 |
| AES-GCM | 有 | 有 (GHASH) | 黃金標準 | 現代系統預設選擇,硬體 AES-NI 加速,支援 AAD 附加資料。 |
| ChaCha20-Poly1305 | 有 | 有 (Poly1305) | 黃金標準 | 無硬體 AES 加速設備(如舊型 Mobile/IoT)的最佳替代方案。 |
AES/ECB/PKCS5PaddingCipher.getInstance("AES") 預設就是 AES/ECB/PKCS5Padding。ECB 模式將相同的明文區塊加密成相同的密文區塊,完全無法隱藏資料特徵(經典企鵝圖案)。AES/GCM/NoPadding。SecureRandom 生成全新的 12-byte (96-bit) Nonce,絕不重複。java.util.Random)java.util.Random 是線性同餘伪隨機數產生器(PRNG),其內部狀態可被輕鬆推算,算出的 IV 或 Key 完全可預測。java.security.SecureRandom**。info),衍生出獨立的 $K_{enc}$ 與 $K_{mac}$。Arrays.equals()MessageDigest.isEqual()。String 物件中String 是 Immutable(不可變)且存在 String Pool 中, GC(垃圾回收)時間不確定,敏感 Key 或明文會在記憶體中停留極長時間,易遭 Heap Dump 竊取。byte[] 或 char[] 處理,使用完畢後立即以 Arrays.fill(keyBytes, (byte) 0) 抹除記憶體。Cipher.doFinal() 解密,解密失敗才檢查 MAC。這給了攻擊者傳送惡意密文誘發 Padding Oracle 的機會。cipher.updateAAD(aadBytes),將明文 Header 綁定至認證標籤中,確保資料未經授權無法被替換。DES、DESede (3DES)、RC4 或 Blowfish。