XML作为一种描述数据的标记语言,它具有可扩展性好、所占存储空间小等特点,大大降低了数据管理和交换的成本,作为一种表示和存储数据的标准,广泛应用于移动数据存储领域,实现数据交换、数据共享等。在XML越来越被广泛应用的同时,XML安全性问题也更加受到关注,如果不能保证数据交换过程中的安全,这种数据交换格式是不完整的,针对XML安全性问题,我们今天就来探讨一下XML加密技术。
一、XML加密技术的优势
目前TLS/SSL(传输层安全性/安全套接字层)已经是在网络上提供通信双方端到端的安全对话非常可靠的协议,XML这种有结构的数据在网络传输方面有它自己的安全需求,比如我们将同一个文件发送给不同的接收者,我们对他们需要保密的信息不同时,使用TLS/SSL不能解决,这是TLS/SSL未涉及的领域,还有一个方面也是TLS/SSL未能覆盖的功能那就是多方之间的安全对话。
1、部分数据加密
XML加密可以对被传输的数据文件进行加密粒度的控制,以在线购书为例,每次提交订单时用户提供的信息应包括书籍信息(书名,作者,订购数量等)和账户信息(信用卡帐号,密码等),所有信息以XML的数据格式发给图书商的发货处和财务。对财务来说,所有信息都可以公开,对发货处来说,我们应该对读者的账户信息进行加密,TLS/SSL只保证传输过程安全,数据在传输结束后的信息是全部公开的。
2、多方之间的安全对话
使用XML加密,对话中的每一方都可以与任何通信方保持安全和非安全状态。可以在同一个文档中交换安全和不安全数据。
3、作为SOAP协议的安全性扩展
SOAP协议可以通过嵌入加密的XML数据文件,实现在消息传输的应用层灵活的加密策略,并且在分布式环境下能交换有结构的数据。
二、XML加密技术实现
XML加密标准如下:
<EncryptedDataID?Type?>
<EncryptionMethod/>?
<ds:KeyInfo>
<EncryptedKey>?
<AgreemenMtethod>?
<ds:KeyName>?
<ds:RetrievaMlethod>?
<ds:*>?
</ds:Keylnfo>?
<CipherData>
<CipherValue>?
<CipherReferenceURI>?
</CipherlData>
<EncryptionProperties/>?
</EncryptedData>
其中,<EncryptedData>元素是XML加密语法中的最重要的元素,其可选的ID属性是直接的任意标识符,可用于特定于具体应用的处理,或者用于像在单个XML文档中区分多个<EncryptedData>元素这样简单的处理。Type属性用于确定明文的类型(用于确定加密了XML元素、元素内容或其它的媒体类型),当加密元素或元素内容时,<EncryptedData>元素替换XML文档加密版本中的该元素或内容。当加密整个XML文档时,<EncryptedData>元素成为新XML文档的根。<CipherData>元素以某种形式(直接存储或引用)表示加密后的数据。<EncryptionMethod>元素用来识别加密算法和可能的一些辅助参数。<ds:Keylnfo>元素描述了如何获得密钥从而对<CipherData>元素的内容解密。<EncryptionProperties>包括其它一些额外的属性。文件加密后仍旧是格式良好的xml文件。
为了便于描述,用做示例的文档如下order.xml
<purchaseOrder>
<Order>
<Item>xmlontology</Item>
<Id>123-958-74598</Id>
</Order>
<Payment>
<CardId>123654-8988889-9996874</CardId>
<CardName>visa</CardName>
</Payment>
</purchaseOrder>
这里尽量选用较简单的XML文档,有助于我们把注意力集中在加密技术上。
1、使用XML加密对整个文档加密
<?xmlversion="1.0"?>
<EncryptedDataxmlns="http://www.w3.org/2001/04/xmlenc#"Type="http://www.is.iedu/in-notes/iana/assignments/media-types/text/xml">
<CipherData>
<CipherValue>A23B45C56</CipherValue>
</CipherData>
</EncryptedData>
当我们需要保护整个文档时,可以对整个文档加密,此时EncryptedData就成为整个文件的根元素,C-ipherData元素存储的是我们要保护的数据。http://www.is.iedu/in-notes/iana/assignments/media-types/text/xml是原xml文件被isi正式定义的类型,http://www.w3.org/2001/04/xmlenc#是原文件所在的命名空间。
2、使用XML加密对单个元素加密
<EncryptedDataType=h'ttp://www.w3.org/2001/04/xmlenc#Element'xmlns=h'ttp://www.w3.org/2001/04/xmlenc#>
<CipherData>
<CipherValue>A23B45C564587</CipherValue>
</CipherData>
</EncryptedData>
这里仅加密了原文件的Payment元素,这个加密后的文件Payment元素被保护,order子元素保持原样,这就实现了一个文档传送给不同部门,而又保证数据安全的策略。
3、使用XML加密对元素内容加密
<Payment>
<CardId>
<EncryptedDataType=h'ttp://www.w3.org/2001/04/xmlenc#Content'xmlns=h'ttp://www.w3.org/2001/04/xmlenc#>'<CipherData>
<CipherValue>A23B45C564587</CipherValue>
</CipherData>
</EncryptedData>
</CardId>
<CardName>visa</CardName>
</Payment>
这种加密方式更直接,只加密了元素CardId的内容,这里的type属性值里面的#Content表明加密的仅仅是元素内容,加密方式2和加密方式3的加密方式使得加密越来越轻量级,更加适合解决我们在分布式、跨平台的网络环境下的安全性问题。
小知识之SOAP协议
简单对象访问协议(Simple Object Access Protocol,SOAP),是一种轻量的、简单的、基于XML的协议,它被设计成在WEB上交换结构化的和固化的信息。 SOAP 可以和现存的许多因特网协议和格式结合使用,包括超文本传输协议(HTTP),简单邮件传输协议(SMTP),多用途网际邮件扩充协议(MIME)。它还支持从消息系统到远程过程调用(RPC)等大量的应用程序。SOAP使用基于XML的数据结构和超文本传输协议(HTTP)的组合定义了一个标准的方法来使用Internet上各种不同操作环境中的分布式对象。