XML加密(XML Encryption)是W3C发布的一项标准,用来对XML文档里的数据块做加密处理。它可以只加密某个节点,也可以加密整份文档,同时保留XML原有的格式与可读性外壳。这样在系统间传输数据时,既能保证敏感信息不泄露,又不破坏消息的结构。

XML Encryption的核心语法
标准里最重要的两个元素是<EncryptedData>和<EncryptedKey>。前者承载加密后的数据,后者用来携带用接收方公钥加密的会话密钥。
EncryptedData基本结构
一个典型的<EncryptedData>节点包含加密算法说明、密文数据以及可选的密钥信息。下面给出一个简化示例:
<EncryptedData xmlns="http://www.w3.org/2001/04/xmlenc#"
Type="http://www.w3.org/2001/04/xmlenc#Element">
<EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes256-cbc"/>
<ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<EncryptedKey>
<EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5"/>
<CipherData>
<CipherValue>加密后的会话密钥Base64</CipherValue>
</CipherData>
</EncryptedKey>
</ds:KeyInfo>
<CipherData>
<CipherValue>加密后的元素密文Base64</CipherValue>
</CipherData>
</EncryptedData>
常用加密类型
- Element:加密整个XML元素,包括标签。
- Content:只加密元素内的子内容,保留外层标签。
- External:加密外部数据,文档中只放引用。
实际应用中如何生成加密XML
在Java环境中,可以使用标准库快速实现。下面代码演示用AES密钥加密一段文本并包装为<EncryptedData>:
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.util.Base64;
public class XmlEncDemo {
public static void main(String[] args) throws Exception {
// 生成AES密钥
KeyGenerator kg = KeyGenerator.getInstance("AES");
kg.init(256);
SecretKey key = kg.generateKey();
// 加密敏感文本
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] enc = cipher.doFinal("身份证号123456".getBytes("UTF-8"));
// 输出密文Base64,实际中应放入CipherValue
String base64 = Base64.getEncoder().encodeToString(enc);
System.out.println(base64);
}
}
典型应用场景
| 场景 | 说明 |
|---|---|
| Web服务安全 | SOAP消息中加密用户信息节点,防止中间人窃取 |
| 单点登录 | SAML断言内加密属性,保障跨域身份隐私 |
| 电子票据 | 对金额与抬头加密,兼顾可读与保密 |
小结
掌握<EncryptedData>与<EncryptedKey>的写法,就能在大多数业务里落地XML Encryption。重点是根据数据敏感度选择Element或Content类型,并妥善保管会话密钥。
XML_EncryptionXML安全数据加密修改时间:2026-07-25 17:57:21