原文地址: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、加密后所有的元素都被命名为<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

转载于:https://blog.51cto.com/webabcd/345081

[翻译]xml的加密和解密相关推荐

  1. xml文件加密和解密

    XML介绍 Extensible Markup Language(XML),可扩展标记语言,是一种用于标记电子文件使其具有结构性的标记语言. XML文件特征如下: a) XML第一行是声明, 格式如下 ...

  2. XML 文件加密与解密

    做这个小程序实属无奈,客户担心文件泄露,要求我们加密,其实都不是什么重要的文件,纯属是客户给我们加工作量,但是也算是学到了一些东西,因此博主对客户的感情掺杂这爱与恨吧.下面看看我的程序吧,其实很简单, ...

  3. 数据中心密码翻译、eas用户密码的加密和解密

    1.加密和解密datacenter的数据库密码 加密:com.kingdee.bos.sql.KSqlUtil.encodePassword(password); 解密: 1.管理控制台执行 deco ...

  4. c语言编程加密和解密,请问有学长做过这个程序设计的吗?C语言写加密解密问题,跪求代码!...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 加解密处理 1.系统的基本功能 编写一个对文件(由数字或字母组成)进行加密解密的程序.可以将所需要的内容(整个文件或者输入的一行字符)加密,也可以将存储的 ...

  5. Windows中EFS加密及解密应用

    Windows中EFS加密及解密应用<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office&q ...

  6. 文本文件加密和解密_解密文本见解和相关业务用例

    文本文件加密和解密 The objective is to provide crisp information about possibilities in Text analytics and ho ...

  7. 实现CSS在线美化(格式化)、压缩、加密、解密、混淆工具-toolfk程序员工具网

    本文要推荐的[ToolFk]是一款程序员经常使用的线上免费测试工具箱,ToolFk 特色是专注于程序员日常的开发工具,不用安装任何软件,只要把内容贴上按一个执行按钮,就能获取到想要的内容结果.Tool ...

  8. 探讨NET Core数据进行3DES加密或解密弱密钥问题

    [导读]之前写过一篇<探讨.NET Core数据进行3DES加密和解密问题>,最近看到有人提出弱密钥问题,换个强密钥不就完了吗,猜测可能是与第三方对接导致很无奈不能更换密钥,所以产生本文解 ...

  9. Java中的AES加密和解密(CBC模式)

    通过有线方式传输诸如纯文本密码之类的机密数据总是容易受到安全性的影响,始终建议对此类信息进行加密并使用SSL传输这些机密数据.Java为此提供了多种加密算法.在本文中,我们将讨论Java中具有CBC模 ...

  10. [引]生成加密和解密的密钥

    1.对称密钥 2.不对称密钥 3.将非对称密钥存储在密钥容器中 4.将非对称密钥存储在密钥容器中示例 =============================== 创建和管理密钥是加密过程的一个重要 ...

最新文章

  1. SAP MM Purchasing Report中Selection Parameter WE101 WE103
  2. webpack的使用、安装和配置打包的入口和出口
  3. java flex 上传文件_使用Flex和java servlet上传文件
  4. 转载OleDb操作Access数据库:新增记录时获取自动编号的主键值
  5. oracle数据抽取脚本,oracle的一些信息抽取脚本.sql
  6. mysql 排名_微服务架构下,如何利用Mysql的limit配合orderby进行排名统计
  7. Color types not allowed (at ‘drawable’ with value ‘#f0f0f0’)
  8. 修复虚拟磁盘LVM表
  9. 《Neural Networks for Machine Learning》学习一
  10. 女人,向《奋斗》中的夏琳米莱们学习什么
  11. ijkplayer、VLC Player、SmartPlayer、ExoPlayer播放器比较
  12. java 日志技术汇总(log4j , Commons-logging,.....)
  13. linux在VM下分辨率的问题
  14. Vmware中安装win7虚拟机以及相关简单知识
  15. error An unexpected error occurred: “https://registry.npmjs.org/axios
  16. Deep Crossing——经典的深度学习架构
  17. Java-Object转JSONObject
  18. 互联网金融产品实战——安全开发篇
  19. too many pod 节点pod总数超出限制
  20. 谁在痛打“诺顿”落水狗

热门文章

  1. 《R语言入门与实践》第八章:S3 与 R 面对对象编程
  2. Java-API:java.util.ArrayList
  3. 我的 Python3.x 的开始-2018.8.3
  4. 【总结】Unity游戏优化
  5. Android studio 配置file encoding 无效,中文乱码解决办法
  6. vijos1053 用spfa判断是否存在负环
  7. 蓝点中文Linux2.0 实验十三 进程与作业管理
  8. 如何 给给软件开发 添加 代理_如何从“菜鸟码农”变成“一线架构师”?
  9. Maven 用Eclipse创建web项目后报错的解决方式
  10. Knockout应用开发指南 第一章:入门