XML Encryption支持对XML文档中部分元素或内容进行选择性加密,通过Type属性(Element/Content)和ReferenceList指定目标,利用Id或XPath精确定位节点,保持文档结构完整与明密文共存,并需妥善管理密钥及KeyInfo。

指定加密目标:用 ReferenceList 或 Type 属性定位内容
XML 加密通过 <EncryptedData> 元素内的 Id、Type 和可选的 ReferenceList 明确指出要加密的是什么:
• Type="http://www.w3.org/2001/04/xmlenc#Element" 表示加密整个 XML 元素(含标签和子内容);
• Type="http://www.w3.org/2001/04/xmlenc#Content" 表示只加密元素的文本内容(不含标签);
• ReferenceList 可引用多个 <DataReference>,实现一对多加密(例如同时加密多个 <CreditCardNumber> 节点)。
用 xpath 或 id 引用 精确选取节点
实际加密前需先识别目标节点:
• 推荐为待加密元素添加唯一 Id 属性(如 <SSN Id="ssn-1">123-45-6789</SSN>),然后在 <EncryptedData> 中用 <EncryptionProperty Target="#ssn-1"> 关联;
• 也可使用 XPath 表达式(需在 <ds:Transforms> 中声明),但要注意 XPath 处理上下文和命名空间兼容性,生产环境更倾向用 Id 引用避免歧义。
保持文档结构与混合明密文共存
加密后,原始节点会被替换成 <EncryptedData>,其他未加密内容保持原样:
• 整个 XML 仍可被解析、验证签名(只要签名范围不覆盖已加密区域);
• 解密方只需识别 <EncryptedData> 并按其 EncryptionMethod 和 KeyInfo 还原文本;
• 示例:一个订单 XML 中,<OrderID> 和 <ShippingAddress> 明文可见,仅 <PaymentInfo> 被加密成 <EncryptedData> —— 结构不变,语义清晰。
注意密钥管理与上下文安全
部分加密不降低密钥保护要求:
• 若用对称密钥(如 AES),密钥本身通常封装在 <EncryptedKey> 中,用接收方公钥加密;
• <KeyInfo> 必须随 <EncryptedData> 一同传输,否则无法解密;
• 避免在明文部分泄露加密逻辑线索(例如不要用明文字段名暗示“此字段已被加密”)。










