利用XML Signature, 消息的完整性(Integrity)得到了保证。回顾之前提到的安全的三个基本概念--- Integrity, Confidentiality, Authentication, 现在该考虑消息的机密性的问题,虽然签名可以保证消息在传送的途中没有被篡改,但是并不能避免它被偷取。如果消息没有经过加密,那么某个敏感的信息就会被泄漏。与XML Signature类似,结合了XML技术和传统加密技术而产生的XML Encryption,也并不仅仅是加密XML文件那么简单,它提供了以下的功能:
1.加密整个XML文件。
2.加密XML文件中的某个元素。
3.加密XML文件中某个元素的内容。
4.加密非XML格式的资源。(例如一张JPEG图片)。
5.加密已经过加密的内容。
XML Encryption的结构如下所示:
<EncryptedData (Id)? (Type)? (MimeType)? (Encoding)?>
(<EncryptionMethod/>)?
(<ds:KeyInfo>
(<ds:KeyName>)?
(<ds:RetrievalMethod>)?
(<ds:*>)?
(<EncryptedKey>)?
(<AgreementMethod>)?
</ds:KeyInfo>)?
<CipherData>
(<CipherValue>)?
(<CipherReference (URI)?>)?
</CipherData>
(<EncryptionProperties>)?
</EncryptedData>
(x)? 代表x出现0-1次 (x)+ 代表x出现1-n次 (x)* 代表x出现0-n次
与XML Signature不同,XML Encryption更加体现了自包含的性质,它不象XML Signature通过引用对某个资源签名,而是在原资源的位置上创建一个新的EncryptedData元素完全的替代原资源(使用CipherReference除外)。也是因为这个原因,你不可能象XML Signature那样在一个Signature元素中对多个资源签名,有几个需要加密的资源就有几个EncryptedData元素替代它们。
EncryptedData元素是原资源经过XML Encryption作用后的结果,将替代原资源。Type属性有两个合法值: element, content. 它们用于区别是否加密tag(标签)。如果Type设为element将加密整个元素包括tag在内, 而设为content时只对元素中的内容加密。
EncryptionMethod元素指定加密将使用的算法。
CipherData元素中的内容为原资源加密后的结果,可以用两种形式表示,通常使用CipherValue,而CipherReference类似于XML Signature的Reference元素,往往用于对外部资源(jpeg文件)的加密。
EncryptionProperties元素用于为加密的数据添加一些额外的信息,比如加密发生的时间。
KeyInfo元素描述加密所使用的密钥。这里的KeyInfo是借用的XML Signature下的KeyInfo元素。在签名的时候,大多使用非对称密钥,即利用私钥产生签名,然后将公钥信息放在KeyInfo元素中,这样消息的接受方就可以直接使用公钥来验证签名。但是在加密的时候,通常使用的是对称密钥,如果此时把密钥的信息直接放在KeyInfo中显然是不安全的。此时有以下几种方法:
1.不使用KeyInfo元素,假定消息交换已经约定好了加密使用的密钥。
2.在KeyInfo中指定一个标识(Identity),假定消息接受方已经拥有了解密所需的密钥,通过这个标识,消息接受方接可以定位到此次解密所需要的密钥。
3.使用消息接受方的公钥加密此次加密消息所使用的对称密钥,消息接受方利用自己唯一拥有的私钥解密出加密消息使用的密钥。
4.通过key agreement protocol获得密钥(较少使用)。
基于以上几种方法,下面对KeyInfo元素做具体介绍:
KeyName: 方法2中的一种形式,通过指定一个标识来获得解密所需的密钥。
RetrievalMethod: 方法2中的另一种形式,通过一个URI指向解密所需的密钥, 比如指向信息中另一段被加密的内容,而那段内容可以方便的被解密。
EncryptedKey: 为了使用第三种方法,XML Encryption为KeyInfo加入的扩展元素。通过非对称密钥技术来传递对称密钥, 综合了两种的优点,前提是消息加密方需拥有消息接受方的公钥。下面是使用该方法的一个例子。
AgreementMethod: 该元素使用key agreement protocol来获得密钥,极少使用故不做介绍。
<EncryptedData>
<EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes128-cbc" />
<ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmlsig#" />
<EncryptedKey>
<EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" />
<ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmlsig#"/>
<ds:X509Data>
<ds:X509SubjectName>
o=MyCompany,ou=Engineering,cn=Dave Remy
</ds:X509SubjectName>
</ds:X509Data>
</ds:KeyInfo>
<CipherData>
<CipherValue>. . .</CipherValue>
</CipherData>
</EncryptedKey>
</ds:KeyInfo>
<CipherData>
<CipherValue>. . .</CipherValue>
</CipherData>
</EncryptedData>
从上面的例子中可以看出EncryptedKey 和EncryptedData 具有类似的结构,其实它们本来就是同一类型(EncryptedType),一个用于加密数据,一个用于加密密钥(密钥就是一种特殊的数据)。它们之间的关系就象面向对象中的sub class和abstract class。EncryptedKey 和EncryptedData是EncryptedType的子类,而EncryptedType是不能具体存在的。因此EncryptedKey可以独立于EncryptedData存在,甚至EncryptedKey还可以象EncryptedData那样在子元素中嵌套EncryptedKey或EncryptedData。
了解了这个特性,就可以避免在两段使用相同密钥加密的消息中重复包含一个复杂的EncryptedKey。利用ReferenceList元素可以在密钥中引用到使用该密钥的不同地方,避免重复。
<Employee>
<Name>Dave Remy</Name>
<SocialSecurityNumber>
<EncryptedData id="socsecnum" Type="http://www.w3.org/2000/09/xmldsig#content">
<EncryptionMethod Algorithm=". . ." />
<CipherData>
<CipherValue>. . .</CipherValue>
</CipherData>
</EncryptedData>
</SocialSecurityNumber>
<Salary>
<EncryptedData id="salary" Type="http://www.w3.org/2000/09/xmldsig#content">
<EncryptionMethod Algorithm=". . .">
<CipherData><CipherValue>. . .</CipherValue></CipherData>
</EncryptedData>
</Salary>
<EncryptedKey>
<EncryptionMethod Algorithm=". . ." />
<CipherData>
<CipherValue>. . .</CipherValue>
</CipherData>
<ReferenceList>
<DataReference URI="#socsecnum" />
<DataReference URI="#salary" />
</ReferenceList>
</EncryptedKey>
</Employee>
通过以上方法,可以通过EncryptedKey中的ReferenceList定位到使用该密钥的不同信息段,但是这是一个单向引用,为了增加可读性,以及方便XML Encryption Processor处理还可以通过CarriedKeyName元素来实现双向引用,在WS-Security中也有类似的实现,示例如下:
<Employee>
<Name>Dave Remy</Name>
<SocialSecurityNumber>
<EncryptedData id="socsecnum" Type="http://www.w3.org/2000/09/xmldsig#content">
<KeyInfo>
<KeyName>Jothy Rosenberg</KeyName>
</KeyInfo>
<EncryptionMethod Algorithm=". . ." />
<CipherData>
<CipherValue>. . .</CipherValue>
</CipherData>
</EncryptedData>
</SocialSecurityNumber>
<Salary>
<EncryptedData id="salary" Type="http://www.w3.org/2000/09/xmldsig#content">
<EncryptionMethod Algorithm=". . .">
<CipherData>
<CipherValue>. . .</CipherValue>
</CipherData>
</EncryptedData>
</Salary>
<EncryptedKey>
<EncryptionMethod Algorithm=". . ." />
<CipherData>
<CipherValue>. . .</CipherValue>
</CipherData>
<ReferenceList>
<DataReference URI="#socsecnum" />
<DataReference URI="#salary" />
</ReferenceList>
<CarriedKeyName>Jothy Rosenberg</CarriedKeyName>
</EncryptedKey>
</Employee>
与XML Signature相比而言,XML Encryption的创建(加密)和验证(解密)过程要简单的多。简要介绍如下:
加密过程:
1.选择一个加密算法
2.选择一个加密用的密钥,如果需要将密钥的有关信息展示给消息接受方。
3.在加密前,将待加密的资源转换为字符流的格式。
4.使用选择的密钥和算法加密经过串行化的原始消息。
5.设置加密的类型(Content还是Element?)。
6.根据结果和以上的选项创建出EncryptedData元素,替代原来的资源。
解密过程:
1.将CipherValue元素的内容抽取出来。
2.从EncryptionMethod的Algorithm中获得加密所用的算法。
3.获得加密的类型(Content还是Element?)。
4.通过KeyInfo中的信息取得密钥。
5.根据以上信息将密文解密获得原始信息。
分享到:
相关推荐
xml加密(XML Encryption)是w3c加密xml的标准。这个加密过程包括加密xml文档的元素及其子元素,通过加密,xml的初始内容将被替换,但其xml格式仍然被完好的保留。 介绍 我们有3个加密xml的方法 1、仅仅使用对称...
### XML文件的加密与解密 #### 一、引言 随着互联网技术的发展以及数据安全意识的提升,对于敏感信息的保护变得尤为重要。XML(可扩展标记语言)作为一种常用的数据交换格式,在诸多应用场景中扮演着重要角色。...
XML(eXtensible Markup Language)是一...在实际项目中,合理运用XML Encryption、DOM-Based Encryption、Stream-Based Encryption以及XML Signature,结合合适的密钥管理和存储策略,可以构建出强大的数据保护方案。
这个库通常包含了对XML Signature和XML Encryption等规范的支持,这些规范由万维网联盟(W3C)定义,用于确保XML数据的安全传输和验证。 XML Signature是一种用于确认XML文档完整性和来源的方法,它通过添加一个...
它遵循W3C制定的XML Encryption规范,提供了一种标准方法来加密XML文档或XML文档的部分内容。 2. **C#中的XML加密库**:在C#中,可以使用System.Security.Cryptography.Xml命名空间下的类来实现XML加密。主要涉及到...
4. **XML安全框架**:像Apache Santuario这样的开源项目提供了对XML安全标准的实现,包括XML Signature和XML Encryption。这些框架简化了在Java应用中集成XML安全功能的过程。 5. **攻击防护**:XML安全还涉及到...
4. **XML加密标准(XML Encryption Syntax and Processing)**:W3C制定的这个标准定义了如何在XML文档中表示加密数据以及如何解密这些数据。它提供了一种结构化的方式来表示加密元素和属性,并定义了加密和解密的...
这些库提供了加密算法的实现,并且支持XML加密标准(XML Encryption Syntax and Processing),这是一个W3C推荐的标准,定义了如何在XML文档中嵌入加密数据。 在提供的"Ex15_11"文件中,可能是示例代码或者相关资源...
XML加密标准(XML Encryption)定义了一种方法,允许XML文档或XML数据片段以一种可验证的方式进行加密。这个过程涉及到创建一个加密数据元素,将原始XML内容转换成密文,然后在需要时解密。.NET Framework提供`...
然后,使用`Xml Encryption` API创建一个`EncryptedData`元素,将XML文档转换为加密形式。这涉及到创建`XmlEncryptedElement`、设置加密算法等步骤。 4. **实际加密**: 使用Aes实例的`CreateEncryptor()`方法获取...
We can use XML Encryption. 2. Each time something is encrypted, it must have the <EncryptedData > tags around it along with information as to what is being encrpted (text, an XML element, ...
这涉及到加密、签名和权限控制等技术,例如使用XML Encryption和XML Signature标准来保护数据的完整性和隐私。 2. **数据验证**:使用XML Schema验证可以防止恶意数据输入,确保系统只接受符合规范的XML文档。 3. ...
XML加密标准(XML Encryption)允许对XML文档或其部分进行加密,确保数据在传输过程中的隐私性。加密过程包括选择一个密钥,创建一个加密元素,并将其替换为原始XML内容。解密时,使用相应的私钥恢复数据。 三、XML...
这个库可能支持多种加密算法,如RSA、AES等,以及不同的XML安全标准,如W3C的XML Signature Syntax and Processing和XML Encryption Syntax and Processing规范。此外,它还可能提供与Java Cryptography Extension...
通过XML Signature可以验证数据的完整性和来源,而XML Encryption则可对敏感数据进行加密,防止数据泄露。 六、XML优化策略 为了减少移动设备上的XML处理开销,可以采取以下策略: 1. 使用压缩格式如GZip压缩XML...
2. **标准规范**:W3C制定了XML Encryption标准,定义了如何对XML文档或其部分进行加密。该标准支持对XML文档的元素、属性、文本内容等进行选择性加密。 3. **过程**:XML加密通常包括以下步骤: - 选择要加密的...
7. **XML的扩展和实际应用**:书中可能还介绍了一些XML的扩展技术,如XML Signature用于数字签名,XML Encryption用于数据加密,或者XML Events处理XML文档的事件。这些技术在安全性和实时性方面为XML增加了新的应用...
W3C组织定义了XML Encryption标准,它提供了一种结构化的XML格式来表示加密的数据和相关的加密元数据。XML加密标准允许加密整个XML文档或文档的特定部分,并支持多种加密算法。 3. **加密过程**: - **密钥管理**...
可以使用XML加密(XML Encryption)和XML签名(XML Signature)来确保数据的保密性和完整性。同时,通过.NET的安全机制,如角色基础的授权(Role-Based Authorization),限制不同用户对论坛数据的访问权限。 最后...
XML加密标准(XML Encryption)是W3C制定的一项标准,它定义了如何将XML文档和数据块加密为XML元素。这个标准提供了将加密数据嵌入到XML文档中以及从XML文档中提取加密数据的方法。通过遵循这一标准,开发者可以确保...