热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

[翻译]xml的加密和解密

原文地址:http:dotnetslackers.comarticlesxmlXMLEncryption.aspx[原文源码下载][翻译]xml的加密和解密原文发
原文地址: http://dotnetslackers.com/articles/xml/XMLEncryption.aspx
[原文源码下载]


[翻译]xml的加密和解密


原文发布日期:2006.12.15
作者: Derek Smyth
翻译: webabcd


xml加密(XML Encryption)是w3c加密xml的标准。这个加密过程包括加密xml文档的元素及其子元素,通过加密,xml的初始内容将被替换,但其xml格式仍然被完好的保留。


介绍
我们有3个加密xml的方法

1、仅仅使用对称加密的方法加密xml
这种加密方法只使用一个密钥,也就是说无论是加密xml还是解密xml都使用一个相同的密钥。因为这个密钥不会在被加密的xml中保存,所以我们需要在加密和解密的过程中加载这个密钥并保护它不被窃取。

2、使用对称加密和非对称加密相结合的方法来加密xml
这种方法需要一个用于加密数据的对称密钥和一个用于保护这个对称密钥的非对称密钥。被加密的对称密钥和被加密的数据一起保存在xml文档中。当用私有非对称密钥解密密钥的时候要用公开非对称密钥对密钥进行加密。

本文就将使用这种方法。想学到其他更多的方法请参看MSDN等到更多的信息。

(译者注:非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。)

3、使用X.509加密xml,这种方法是用X.509作为非对称密钥,它由诸如VeriSign之类的第三方提供。


方法
不管xml加密是如何完成的,保存加密数据总是用两种方法之一。
1、加密后所有的元素都被命名为
2、加密后只有数据被替换,而元素名称仍然是可读的,不会发生变化。

这种微妙的变化是非常重要的。例如:

如果你的xml文档中包括被称为的根元素,该根元素有一个下存储了一段详细信息的被称做的子元素。如果你发送这个xml,并且想这个元素被保护起来,那么使用第1中方法的话将被替换为,你不会从加密后的文档中获取到任何可读的信息。

如果使用第2种方法,那么元素仍然被保留,只用数据会被加密。任何得到这个文档的人虽然不能知道该元素下的详细信息,但仍然知道有一些事情发生在这个雇员身上。另外,元素的所有属性也不会被加密。

所以,如果没有特殊需求,我们一般都用第1种方法。在.net 2.0中你可以通过修改一个Boolean值的属性,便可以非常简单的选择使用哪种方法。

xml加密的例子
下面这个xml加密的例子使用的是非对称加密法,把xml文档的author元素下的内容加密并把author元素用给替换掉。

xml文档
xml version="1.0" standalOne="no" ?>
< article >
  
< articleinfo >
    
< title > XPath Queries on XmlDocument objects in .NET 1.1 title >
    
< abstract >
      
< para > This article covers the basics. para >
    
abstract >
    
< author >
      
< honorific > Mr. honorific >
      
< firstname > George firstname >
      
< surname > James surname >
      
< email > gjames@doman.com email >
    
author >
  
articleinfo >   
article >

XPath表达式为/article/articleinfo/author

被加密后的xml文档
xml version="1.0" standalOne="no" ?>
< article >
  
< articleinfo >
    
< title > XPath Queries on XmlDocument objects in .NET 1.1 title >
    
< abstract >
      
< para > This article covers the basics. para >
      
< para > This article does not cover. para >
    
abstract >
    
< EncryptedData  Type ="http://www.w3.org/2001/04/xmlenc#Element"  
        xmlns
="http://www.w3.org/2001/04/xmlenc#" >
      
< EncryptionMethod             Algorithm ="http://www.w3.org/2001/04/xmlenc#aes256-cbc"   />
      
< KeyInfo  xmlns ="http://www.w3.org/2000/09/xmldsig#" >
        
< EncryptedKey  xmlns ="http://www.w3.org/2001/04/xmlenc#" >
          
< EncryptionMethod                 Algorithm ="http://www.w3.org/2001/04/xmlenc#rsa-1_5"   />
          
< KeyInfo  xmlns ="http://www.w3.org/2000/09/xmldsig#" >
            
< KeyName > session KeyName >
          
KeyInfo >
          
< CipherData >
            
< CipherValue > r4f7SI1aZKSvibb… CipherValue >
          
CipherData >
        
EncryptedKey >
      
KeyInfo >
      
< CipherData >
        
< CipherValue > sGNhKqcSovipJdOFCFKYEEMRFd… CipherValue >
      
CipherData >
    
EncryptedData >
  
articleinfo >
article >

author元素及其子元素都将被给替换掉,另外还包括其他一些元素,如加密算法,密钥等。

元素
仔细看看元素的树形结构,你会发现元素下分解出了很多子元素。其中元素与xml数字签名中的元素是相同的。


EncryptedData元素被包含在“http://www.w3.org/2001/04/xmlenc#”命名空间中。它是被加密数据的根元素。

EncryptionMethod元素指定加密数据的对称方法。做这件事需要使用一个包含了w3 url的算法属性 - “http://www.w3.org/2001/04/xmlenc#aes256-cbc”,它指出数据是用AES(Rijndael)以256k的密钥加密的。

KeyInfo元素来自xml数字签名,它保存着对称密钥的信息,除此之外该元素还能保存更多的信息。

KeyInfo元素下的EncryptedKey元素及其子元素包含着关于被保存的密钥的信息。

KeyInfo下的EncryptionMethod元素包含的非对称加密方法用来加密对称密钥。做这件事需要把一个算法属性设置给w3 url。例如:“http://www.w3.org/2001/04/xmlenc#rsa-1_5”说明使用了RSA非对称算法来加密对称密钥。

KeyName元素是一个标识符,用来发现密钥。稍后在我们编程的时候你将会发现它的重要性。

CipherData元素和CipherValue元素出现在EncryptedKey元素和EncryptedData元素下,它们包含着密码数据。事实上密码数据保存在CipherValue元素下的。EncryptedKey元素下保存的是被加密的密钥,EncryptedData元素下的CipherValue保存的是被加密的数据。


非对称xml加密步骤
xml加密的过程可以概括为以下五步:
1、选择xml文档中的一个元素(选择根元素的话将加密整个文档)
2、使用一个对称密钥加密元素
3、使用非对称加密来加密上面那个对称密钥(使用公开密钥)
4、创建一个EncryptedData元素,该元素下将包含被加密的数据和被加密的密钥
5、用加密后的元素替换掉初始元素。
这些步骤的大部分都可以使用.net 2.0中的类自动完成。


非对称xml解密步骤
xml解密的过程可以概括为以下四步:
1、在xml文档中选择一个EncryptedData元素
2、使用一个非对称密钥来解密密钥(使用私有密钥)
3、使用未加密的密钥来解密数据
4、把EncryptedData元素替换成未加密的元素
这些步骤的大部分都可以使用.net 2.0中的类自动完成。


命名空间
完成xml的加密,我们需要引入三个命名空间
System.Xml - 包含操作xml的类
System.Security.Cryptography - 包含生成加密密钥的类
System.Security.Cryptography.Xml - 包含完成加密任务的类


使用.net加密xml
本文提供了一个简单的加密、解密xml的应用程序,下面我们一起来看一看相关的代码。这个示例只有一些基本功能,你可以再额外加一些如选择节点之类的功能

首先加载非对称公开密钥来加密密钥
//  创建一个用于加密密钥的非对称密钥
RSACryptoServiceProvider rsa  =   new  RSACryptoServiceProvider();
//  加载一个公开密钥
XmlDocument pubKeys  =   new  XmlDocument();
pubKeys.Load(Application.StartupPath 
+   " \\xml.dev.keys.public " );
//  使用公开密钥加密密钥
rsa.FromXmlString(pubKeys.OuterXml);

接下来加载xml文档并选择一个需要加密的节点。下面的代码示例了如何使用一个XPath表达式来选择节点。如果不选择节点,则整个xml文档都将被加密。
//  xml文档
this .xmlEncDoc  =   new  XmlDocument();

//  给xml文档加载一些节点和数据(省略)

XmlElement encElement;
//  如果没有xpath则
if  (xpath  ==   string .Empty)
{
  encElement 
= this.xmlEncDoc.DocumentElement;
}

else
{
  XmlNamespaceManager xmlns 
= this.xmlCntrlr.xmlnsManager;
  
// 通过xpath选择出需要加密的元素
  encElement = this.xmlEncDoc.SelectSingleNode(xpath, xmlns) as XmlElement;
}

使用EncryptedXml类去加密数据和密钥
//  完成加密xml的类
EncryptedXml xmlEnc  =   new  EncryptedXml( this .xmlEncDoc);
//  增加一个“session”密钥,使用rsa编码
xmlEnc.AddKeyNameMapping( " session " , rsa);
//  使用“session”密钥来加密数据
//  这些信息被保存在KeyInfo元素下
EncryptedData encData  =  xmlEnc.Encrypt(encElement,  " session " );

用加密后的元素替换初始元素
//  用加密后的元素替换初始元素
EncryptedXml.ReplaceElement(encElement, encData,  false );


使用.net解密xml
首先加载私有非对称密钥来解密密钥
//  创建一个用于解密密钥的非对称密钥
RSACryptoServiceProvider rsa  =   new  RSACryptoServiceProvider();
//  加载私有密钥
XmlDocument privKeys  =   new  XmlDocument();
privKeys.Load(Application.StartupPath 
+   " \\xml.dev.keys.private " );
//  使用私有密钥来解密密钥
rsa.FromXmlString(privKeys.OuterXml);

增加一个密钥名称并映射到被加密的文档中
//  增加一个密钥名称并映射到被加密的文档中
EncryptedXml encXml  =   new  EncryptedXml(xmlEncDoc);
encXml.AddKeyNameMapping(
" session " , rsa);

通过指定的密钥来解密文档的每一个EncryptedData元素
//  解密所有元素
encXml.DecryptDocument();


总结
xml加密(XML Encryption)是w3c加密xml的标准。加密后的文档仍然是xml格式。我们使用非对称和对称算法来加密xml,对称算法用于加密数据,非对称算法用于加密对称算法中的密钥,加密后的数据被保存在EncryptedData元素下。EncryptedData元素包含着一些列用于描述算法的子元素,同时也包含着密钥信息。


参考
W3C Encryption Standard


下载
[原文源码下载]


译者补充:
.net 2.0下加密和解密web.config文件中的某个section

aspnet_regiis –pef appSettings C:\Inetpub\wwwroot\website

aspnet_regiis –pdf appSettings C:\Inetpub\wwwroot\website
推荐阅读
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • Firefox火狐浏览器关闭到http://detectportal.firefox.com的流量问题解决办法
    本文介绍了使用Firefox火狐浏览器时出现关闭到http://detectportal.firefox.com的流量问题,并提供了解决办法。问题的本质是因为火狐默认开启了Captive portal技术,当连接需要认证的WiFi时,火狐会跳出认证界面。通过修改about:config中的network.captive-portal-service.en的值为false,可以解决该问题。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • 本文介绍了将mysql从5.6.15升级到5.7.15的详细步骤,包括关闭访问、备份旧库、备份权限、配置文件备份、关闭旧数据库、安装二进制、替换配置文件以及启动新数据库等操作。 ... [详细]
  • Spring学习(4):Spring管理对象之间的关联关系
    本文是关于Spring学习的第四篇文章,讲述了Spring框架中管理对象之间的关联关系。文章介绍了MessageService类和MessagePrinter类的实现,并解释了它们之间的关联关系。通过学习本文,读者可以了解Spring框架中对象之间的关联关系的概念和实现方式。 ... [详细]
  • 基于Axis、XFire、CXF的webservice客户端调用示例
    本文介绍了如何使用Axis、XFire、CXF等工具来实现webservice客户端的调用,以及提供了使用Java代码进行调用的示例。示例代码中设置了服务接口类、地址,并调用了sayHello方法。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
author-avatar
挚远-十年
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有