| 技術 | 類型 | 解決問題 | 關鍵特性 |
| 共享金鑰加密 | 對稱式 (AES, DES) | 機密性 | 加解密同一金鑰,速度快,適合大量資料 |
| 公開金鑰加密 | 非對稱式 (RSA, ECC) | 機密性 + 身分驗證 | 公鑰加密/私鑰解密;私鑰簽名/公鑰驗證 |
| 數位簽章 | 非對稱式雜湊+簽名 | 完整性 + 不可否認性 + 來源驗證 | 簽名內容含雜湊值,任何修改即驗證失敗 |
| 混合加密 | 對稱+非對稱組合 | 大量資料高效加密 + 金鑰安全交換 | 隨機產生對稱金鑰加密資料,再用公鑰加密對稱金鑰 |
Atom 安全處理標準流程 (RFC 4287 / XML Encryption / XML Signature)
- 規範化:對要簽名/加密的 XML 片段進行 Canonicalization (C14N),消除空白、屬性順序等無關差異。
- 數位簽章:
- 計算規範化內容的 SHA-256 雜湊
- 用發送者私鑰 (RSA/ECDSA) 加密雜湊值產生簽名
- 將
<Signature> 元素嵌入 Atom Entry/Feed
- 加密 (可選):
- 產生隨機 AES-256 金鑰
- 用 AES 加密敏感元素內容
- 用接收者公鑰 (RSA-OAEP) 加密 AES 金鑰
- 將
<EncryptedData> + <EncryptedKey> 替換原明文元素
- 傳輸:HTTPS 提供傳輸層加密,應用層簽章/加密提供端到端保護。
Java 實作關鍵 API (JCA/JCE)
// 1. 數位簽章
Signature sig = Signature.getInstance("SHA256withRSA");
sig.initSign(privateKey);
sig.update(canonicalizedXmlBytes);
byte[] signature = sig.sign();
// 驗證
Signature ver = Signature.getInstance("SHA256withRSA");
ver.initVerify(publicKey);
ver.update(canonicalizedXmlBytes);
boolean valid = ver.verify(signature);
// 2. 混合加密
// 產生 AES 金鑰
KeyGenerator kg = KeyGenerator.getInstance("AES");
kg.init(256);
SecretKey aesKey = kg.generateKey();
// 加密資料
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, aesKey);
byte[] iv = cipher.getIV();
byte[] cipherText = cipher.doFinal(plainText);
// 加密 AES 金鑰 (RSA-OAEP)
Cipher keyCipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");
keyCipher.init(Cipher.ENCRYPT_MODE, recipientPublicKey);
byte[] encryptedAesKey = keyCipher.doFinal(aesKey.getEncoded());
// 解密流程對稱:先用私鑰解出 AES 金鑰,再用 AES-GCM 解密資料
XML Security 庫簡化實作
手工組裝 <Signature>/<EncryptedData> 易出錯,建議使用 Apache Santuario (XMLSec):
// 簽名範例
XMLSignature sig = new XMLSignature(doc, "", XMLSignature.ALGO_ID_SIGNATURE_RSA_SHA256);
element.appendChild(sig.getElement());
sig.addDocument("", Canonicalizer.ALGO_ID_C14N_OMIT_COMMENTS);
sig.addKeyInfo(rsaKey);
sig.sign(privateKey);
// 加密範例
EncryptedData ed = new EncryptedData(doc, EncryptedData.TYPE_ELEMENT, EncryptedData.ALGO_ID_BLOCKCIPHER_AES256_GCM);
ed.setKeyInfo(new KeyInfo(doc));
ed.getKeyInfo().addEncryptedKey(encryptedKeyElement);
ed.encryptAndReplace(element, aesKey);
金鑰管理最佳實務
- 私鑰儲存於 HSM 或加密 KeyStore (PKCS#12, JCEKS),嚴禁硬編碼或放入版控。
- 定期輪換金鑰,建立撤銷機制 (CRL/OCSP)。
- 簽名驗證時檢查憑證鏈、有效期限、用途 (KeyUsage: nonRepudiation/digitalSignature)。
- 加密金鑰僅限單次使用 (Ephemeral),防止單一金鑰洩露導致歷史資料全盤解密。
結語
Atom Feed 安全不只是「加個密」,而是簽章保證來源與完整性、加密保護機密性、金鑰管理支撐信任鏈的系統工程。Java 完整的 JCA/JCE 與 Apache Santuario 提供工業級實作基礎,開發者需深入理解密碼學原理與 XML Security 標準,才能構建真正可信的資訊交換管道。
- 上一篇文章: JDBC 連線 MySQL 常見錯誤排查:驅動版本不匹配導致 Communication Failure
- 下一篇文章: 成為合格 Java 初級工程師:六大核心知識體系與學習路徑指南
Copyright ©
程式碼之家 All Rights Reserved