跳转到内容

XML - 数据交换管理/XML 加密

来自维基教科书,开放的书籍,开放的世界



上一章 下一章
将 MySQL 转换为 XML XQL



作者: Shayla S. Lee 2005 年 11 月 15 日 02:38 (UTC)

XML 加密是为了解决传输层安全协议和安全套接字层协议 (TLS/SSL) 未解决的两个常见问题而开发的。TLS/SSL 是一种非常安全可靠的协议,它在两个参与者之间提供端到端安全会话。XML 通过加密部分或全部交换数据以及允许在多于两个参与者之间进行安全会话,为 TLS/SSL 添加了一层额外的安全性。换句话说,每个参与者都可以与任何通信参与者保持安全或不安全的会话,并且可以在同一文档中交换安全和非安全数据。此外,XML 加密可以处理 XML 和非 XML(例如二进制)数据。

加密语法

[编辑 | 编辑源代码]

所有 XML 加密文件都必须以以下 XML 前言、声明、内部实体和导入开头。

Schema Definition:
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE schema  PUBLIC "-//W3C//DTD XMLSchema 200102//EN"
  "http://www.w3.org/2001/XMLSchema.dtd"
  [
    <!ATTLIST schema
      xmlns:xenc CDATA #FIXED 'http://www.w3.org/2001/04/xmlenc#'
      xmlns:ds CDATA #FIXED 'http://www.w3.org/2000/09/xmldsig#'>
    <!ENTITY xenc 'http://www.w3.org/2001/04/xmlenc#'>
    <!ENTITY % p ''>
    <!ENTITY % s ''>
   ]>
 
 <schema xmlns='http://www.w3.org/2001/XMLSchema' version='1.0'
         xmlns:ds='http://www.w3.org/2000/09/xmldsig#'
         xmlns:xenc='http://www.w3.org/2001/04/xmlenc#'
         targetNamespace='http://www.w3.org/2001/04/xmlenc#'
         elementFormDefault='qualified'>
   <import namespace='http://www.w3.org/2000/09/xmldsig#'
           schemaLocation='http://www.w3.org/TR/2002/REC-xmldsig-core-20020212/xmldsig-core-   schema.xsd'/>


EncryptedType 元素

[编辑 | 编辑源代码]

EncryptedType 是 EncryptedData 和 EncryptedKey 衍生的抽象类型。

 Schema Definition:
  <complexType name='EncryptedType' abstract='true'>
   <sequence>
     <element name='EncryptionMethod' type='xenc:EncryptionMethodType' 
              minOccurs='0'/>
     <element ref='ds:KeyInfo' minOccurs='0'/>
     <element ref='xenc:CipherData'/>
     <element ref='xenc:EncryptionProperties' minOccurs='0'/>
   </sequence>
   <attribute name='Id' type='ID' use='optional'/>
   <attribute name='Type' type='anyURI' use='optional'/>
   <attribute name='MimeType' type='string' use='optional'/>
   <attribute name='Encoding' type='anyURI' use='optional'/> 
  </complexType>

语法解释

EncryptionMethod 是一个可选元素,它描述应用于密文数据的加密算法。如果该元素不存在,则接收方必须知道加密算法,否则解密将失败。

<element name='EncryptionMethod' type='xenc:EncryptionMethodType' 
              minOccurs='0'/>

ds:KeyInfo 是一个可选元素,它包含有关用于加密数据的密钥的信息。本规范的后续部分定义了可能作为 ds:KeyInfo 子元素出现的新的元素。

<element ref='ds:KeyInfo' minOccurs='0'/>


CipherData 是一个必须元素,它包含包含加密数据的 CipherValue 或 CipherReference。

<element ref='xenc:CipherData'/>

EncryptionProperties 可以包含有关生成 EncryptedType 的附加信息(例如,日期/时间戳)。

<element ref='xenc:EncryptionProperties' minOccurs='0'/>

Id 是一个可选属性,它提供在文档上下文中为元素分配字符串 ID 的标准方法。

<attribute name='Id' type='ID' use='optional'/>


Type 是一个可选属性,它标识有关加密内容明文形式的类型信息。虽然是可选的,但本规范利用它在解密中进行强制处理。如果 EncryptedData 元素包含类型为“元素”或元素“内容”的数据,并且在 XML 文档上下文中替换了该数据,则强烈建议提供 Type 属性。没有此信息,解密器将无法自动将 XML 文档恢复到其原始明文形式。

<attribute name='Type' type='anyURI' use='optional'/>

MimeType 是一个可选的(建议性的)属性,它描述已加密数据的媒体类型。此属性的值是 [MIME] 中定义的字符串。例如,如果加密的数据是 base64 编码的 PNG,则传输编码可以指定为 'http://www.w3.org/2000/09/xmldsig#base64' 并且 MimeType 为“image/png”。此属性纯粹是建议性的;不需要对 MimeType 信息进行任何验证,并且它不表示加密应用程序必须执行任何其他处理。请注意,如果此信息已经绑定到 Type 属性中的标识符,则可能不需要此信息。例如,本规范中定义的 Element 和 Content 类型始终是 UTF-8 编码的文本。

<attribute name='MimeType' type='string' use='optional'/>

EncryptionMethod 元素

[编辑 | 编辑源代码]

EncryptionMethod 是一个可选元素,它描述应用于密文数据的加密算法。如果该元素不存在,则接收方必须知道加密算法,否则解密将失败。EncryptionMethod 的允许子元素由 Algorithm 属性 URI 的特定值确定。

Schema Definition:
 <complexType name='EncryptionMethodType' mixed='true'>
   <sequence>
     <element name='KeySize' minOccurs='0' type='xenc:KeySizeType'/>
     <element name='OAEPparams' minOccurs='0' type='base64Binary'/>
     <any namespace='##other' minOccurs='0' maxOccurs='unbounded'/>
   </sequence>
   <attribute name='Algorithm' type='anyURI' use='required'/>
 </complexType>

CipherData 元素

[编辑 | 编辑源代码]

CipherData 是一个必须元素,它提供加密数据。它必须包含作为 CipherValue 元素的 base64 编码文本的加密八位字节序列,或者通过 CipherReference 元素提供对包含加密八位字节序列的外部位置的引用。

Schema Definition:
 <element name='CipherData' type='xenc:CipherDataType'/>
 <complexType name='CipherDataType'>
    <choice>
      <element name='CipherValue' type='base64Binary'/>
      <element ref='xenc:CipherReference'/>
    </choice>
  </complexType>

CipherReference 元素

[编辑 | 编辑源代码]

CipherReference 标识一个源,当处理该源时,会产生加密的八位字节序列。当未直接提供 CipherValue 时,使用 CipherReference。实际值是按如下方式获得的。CipherReference URI 包含一个标识符,该标识符会被取消引用。如果 CipherReference 元素包含可选的 Transforms 序列,则对从取消引用 URI 生成的结果数据进行指定转换,以便产生预期的密文值。例如,如果该值在 XML 文档中以 base64 编码的形式存在;转换可以指定一个 XPath 表达式,然后是 base64 解码,以便提取八位字节。

Schema Definition:
 <element name='CipherReference' type='xenc:CipherReferenceType'/>
  <complexType name='CipherReferenceType'>
      <sequence>
        <element name='Transforms' type='xenc:TransformsType' minOccurs='0'/>
      </sequence>
      <attribute name='URI' type='anyURI' use='required'/>
  </complexType>
   <complexType name='TransformsType'>
      <sequence>
        <element ref='ds:Transform' maxOccurs='unbounded'/> 
      </sequence>
    </complexType>

带可选转换功能的密文引用和转换算法

<CipherReference URI="http://www.example.com/CipherValues.xml">
   <Transforms>
     <ds:Transform 
      Algorithm="http://www.w3.org/TR/1999/REC-xpath-19991116">
         <ds:XPath xmlns:rep="http://www.example.org/repository">
           self::text()[parent::rep:CipherValue[@Id="example1"]]
         </ds:XPath>
     </ds:Transform>
     <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#base64"/>
   </Transforms>
 </CipherReference>

EncryptedData 元素

[编辑 | 编辑源代码]

EncryptedData 是语法中的核心元素。它的 CipherData 子元素不仅包含加密数据,而且是替换加密元素或用作新文档根的元素。

Schema Definition:
 <element name='EncryptedData' type='xenc:EncryptedDataType'/>
 <complexType name='EncryptedDataType'>
   <complexContent>
    <extension base='xenc:EncryptedType'>
    </extension>
   </complexContent>
 </complexType>

以上信息来自 W3C 和 IBM。有关更多信息,请访问以下链接

http://www.w3.org/TR/2002/CR-xmlenc-core-20020802/#sec-Encryption-Syntax
http://www-128.ibm.com/developerworks/xml/library/x-encrypt/
华夏公益教科书