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、加密后所有的元素都被命名为<EncryptedData>
2、加密后只有数据被替换,而元素名称仍然是可读的,不会发生变化。

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

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

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

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

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

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元素及其子元素都将被<EncryptedData>给替换掉,另外还包括其他一些元素,如加密算法,密钥等。

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

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元素

// 解密所有<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

xml的加密和解密的更多相关文章

  1. xml文件加密上传和sftp下载解密基本思路

    AES对称加密效率高,对大文件加密适合.RSA非对称加密效率低,更安全,对小文件加密适合. 整理 11:12 2016/8/4 加密:1.xml xml.md5摘要 2.(xml)aes加密 (xml ...

  2. Java Base64加密、解密原理Java代码

    Java Base64加密.解密原理Java代码 转自:http://blog.csdn.net/songylwq/article/details/7578905 Base64是什么: Base64是 ...

  3. 银联手机支付(.Net Csharp),3DES加密解密,RSA加密解密,RSA私钥加密公钥解密,.Net RSA 3DES C#

    前段时间做的银联支付,折腾了好久,拼凑的一些代码,有需要的朋友可以参考,本人.Net新手,不保证准确性! 这个银联手机支付没有SDK提供,技术支持也没有.Net的,真心不好搞! RSA加解密,这里有个 ...

  4. RSA不对称加密,公钥加密私钥解密,私钥加密公钥解密

    RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作. RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一 ...

  5. ASP.NET Core RSA加密或解密

    前言 这两天主要是公司同事用到了RSA加密,事后也看了下,以为很简单,最终利用RSACryptoServiceProvider来实现RSA加密,然后大致了解到RSACryptoServiceProvi ...

  6. 使用PHP实现RSA算法的加密和解密

    本文提供使用RSA算法加密解密数据的PHP程序类(签名和验签的实现方式可以查看使用PHP实现RSA算法的签名和验签 这篇文章),封装了格式化公钥和私钥文件的方法,这样无论使用什么格式的公钥或者私钥都可 ...

  7. C#实现RSA加密与解密、签名与认证

    一.RSA简介 RSA公钥加密算法是1977年由Ron Rivest.Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的.RSA取名来自开发他们三者的名字.RSA是目前最有影响力 ...

  8. RSA生成、加密、解密、签名。

    首先,要会生成RSA密码对. https://app.alipay.com/market/document.htm?name=saomazhifu#page-23    (事例中的密钥对好像有问题,最 ...

  9. C# 与 Java Rsa加密与解密互通

    Rsa 加密标准的制定已经过去了十多年了. 这两天在看rsa 加密的文章,基本上都是在说 .net 与 java 之间的 rsa加密是不能互通的.因为项目有用到,所以花了点时间对rsa加密做了一点点了 ...

随机推荐

  1. Linux 从 sar 到 sar2html 的认识

    这些变形的工具.诸如:淘宝的Tsar.ksar.sar2html....等.都是通过抓取 sar的数据   所以在最终呈现的数据上变化不大.只是展现的手段和效果不一样而已      sar 是帮助我们 ...

  2. html中window对象top 、self 、parent 等属性

    window对象用法: http://www.w3school.com.cn/htmldom/dom_obj_window.asp top 属性返回最顶层的先辈窗口. 该属性返回对一个顶级窗口的只读引 ...

  3. MySQL单列索引和组合索引的区别介绍

    MySQL单列索引和组合索引的区别介绍 作者:佚名出处:IT专家网2010-11-22 13:05 MySQL单列索引是我们使用MySQL数据库中经常会见到的,MySQL单列索引和组合索引的区别可能有 ...

  4. CSS中zoom:1的作用

    兼容IE6.IE7.IE8浏览器,经常会遇到一些问题,可以使用zoom:1来解决,有如下作用:触发IE浏览器的haslayout解决ie下的浮动,margin重叠等一些问题.比如,本站使用DIV做一行 ...

  5. em px 简单换算

    大部分的网页设计者在CSS代码编写中总是先对整体定义字体尺寸,中文情况下一般为12px,而其实这样以来在通过IE顶部菜单中的“察看-文字大小”设置已无任何 作用.对字体感觉太小的浏览者而言无疑是种很不 ...

  6. jQuery制作go to top按钮

    转自:http://www.w3cplus.com/jquery/scrolling-to-the-top-with-jquery 每每看到网友Blog的页面底部或中间有一个按钮回到页面顶部,羡慕死人 ...

  7. phpize 编译安装memcached

    下面是Memcached的安装过程: #wget http://memcached.googlecode.com/files/memcached-1.4.9.tar.gz # tar zvxf mem ...

  8. 【结构型】Proxy模式

    代理模式是指为其他对象提供代理来控制对象的访问.这种手段有时候可以给我们带来许多好处.如:通过代理可以实现异步响应处理:通过代理可以起到保护或限制对象的使用的作用,从而提高安全性. 在设计上,用户使用 ...

  9. 导出函数结构 EXPORT_DIRECTORY

    typedef struct _IMAGE_EXPORT_DIRECTORY { DWORD Characteristics; DWORD TimeDateStamp; //输出表的创建时间 WORD ...

  10. Linux_install jdk

    Linux安装JDK步骤 1.先从网上下载jdk(jdk-7u1-linux-i586.rpm),下载地址:http://www.oracle.com/technetwork/java/javase/ ...