文章目录

  • 第十七章 加密XML文档
  • 关于加密的XML文档
  • 创建加密的XML文档
    • 加密的前提条件
    • 容器类的要求
    • 生成加密的XML文档
  • 解密加密的XML文件
    • 解密的前提条件
    • 解密文档

第十七章 加密XML文档

本章介绍如何加密XML文档。

提示:发现在此命名空间中启用SOAP日志记录非常有用,这样就可以收到有关任何错误的更多信息。

关于加密的XML文档

加密的XML文档包括以下元素:

  • <EncryptedData>元素,其中包含由随机生成的对称密钥加密的加密数据。(使用对称密钥加密比使用公钥加密更有效。)
  • 至少有一个<EncryptedKey>元素。每个<EncryptedKey>元素携带用于加密数据的对称密钥的加密副本;它还包含一个带有公钥的X.509证书。拥有匹配私钥的接收方可以解密对称密钥,然后解密<EncryptedData>元素。
  • (可选)其他明文元素。
<?xml version="1.0" encoding="utf-8"?><Container xmlns="http://www.w3.org/2001/04/xmlenc#">  <EncryptedKey> <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p"> <DigestMethod xmlns="http://www.w3.org/2000/09/xmldsig#" Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></DigestMethod> </EncryptionMethod>  <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">  <X509Data> <X509Certificate>MIICnDCCAYQCAWUwDQYJKo... content omitted</X509Certificate> </X509Data> </KeyInfo>  <CipherData> <CipherValue>J2DjVgcB8vQx3UCy5uejMB ... content omitted</CipherValue> </CipherData>  <ReferenceList> <DataReference URI="#Enc-E0624AEA-9598-4436-A154-F746B07A2C55"/> </ReferenceList> </EncryptedKey>  <EncryptedData Id="Enc-E0624AEA-9598-4436-A154-F746B07A2C55" Type="http://www.w3.org/2001/04/xmlenc#Content"> <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes128-cbc"></EncryptionMethod>  <CipherData> <CipherValue>LmoBK7+nDelTOsC3 ... content omitted</CipherValue> </CipherData> </EncryptedData>
</Container>

要创建加密文档,请使用类%XML.Security.EncryptedData%XML.Security.EncryptedKey。这些启用XML的类投影到适当名称空间中的有效<EncryptedData><EncryptedKey>元素。

创建加密的XML文档

创建加密的XML文档的最简单方法如下:

  1. 定义并使用可以直接投影到所需XML文档的通用容器类。
  2. 创建包含要加密的XML的流。
  3. 加密该流,并将其与相应的加密密钥一起写入容器类的相应属性。
  4. 为容器类生成XML输出。

加密的前提条件

在加密文档之前,必须创建包含要将加密文档发送到的实体的证书的 IRIS凭据集。在这种情况下,不需要(也不应该拥有)关联的私钥。

容器类的要求

一个通用容器类必须包括以下内容:

  • 类型为%XML.Security的属性。
    被投影为<EncryptedData>元素的EncryptedData

这个属性将携带加密的数据。

  • 至少一个类型为%XML.Security的属性。被投影为<EncryptedKey>元素的EncryptedKey

这些属性将携带相应的密钥信息。

示例如下:

Class XMLEncryption.Container Extends (%RegisteredObject, %XML.Adaptor)
{Property Data As %XML.Security.EncryptedData(XMLNAME = "EncryptedData");Property Key As %XML.Security.EncryptedKey(XMLNAME = "EncryptedKey");Parameter NAMESPACE = "http://www.w3.org/2001/04/xmlenc#";}

生成加密的XML文档

要生成并编写加密文档,请执行以下操作:

  1. 创建包含XML文档的流。

为此,通常使用%XML.Writer将启用XML的对象的输出写入流。

  1. 创建%SYS.X509Credentials的至少一个实例,将访问要向其提供加密文档的实体的InterSystems IRIS凭据集。为此,请调用此类的GetByAlias()类方法。例如:
 set credset=##class(%SYS.X509Credentials).GetByAlias("recipient")

若要运行此方法,必须以该凭据集的OwnerList中包含的用户身份登录,否则OwnerList必须为空。

  1. 至少创建%XML.Security.EncryptedKey实例。若要创建此类的实例,请使用此类的CreateX509()类方法。例如:
 set enckey=##class(%XML.Security.EncryptedKey).Createx509(credset,encryptionOptions,referenceOption)
  • credset%SYS的实例。
    x509credentials在刚刚创建的新窗口中打开。
  • encryptionOptions$$$SOAPWSIncludeNone(还有其他选项,但它们不适用于此场景)。

此宏在%soap.inc包含文件中定义。

  • referenceOption指定了对加密元素的引用的性质。

这里使用的宏在%soap.inc包含文件中定义。

  1. 在创建%Library.ListOfObjects实例,并使用其Insert()方法在刚创建插入%XML.Security.EncryptedKey实例。
  2. 使用%New()方法创建%XML.Security.EncryptedData实例。例如:
 set encdata=##class(%XML.Security.EncryptedData).%New()
  1. 使用%XML.Security.EncryptedData的EncryptStream()实例方法加密在步骤2中创建的流。例如:
 set status=encdata.EncryptStream(stream,encryptedKeys)
  • stream 流是在步骤1中创建的流。
  • encryptedKeys是在步骤4中创建的密钥列表。
  1. 创建并更新容器类的实例。
  • 将键列表写入此类的相应属性。
  • %XML.Security.EncryptedData的实例写入此类的相应属性。
  1. 使用%XML.Writer为容器类生成输出。

例如,前面显示的CONTAINER类还包括以下方法:

/// w ##class(XMLEncryption.Container).Demo("E:\temp\SecurityXml.txt")
ClassMethod Demo(filename = "", obj = "")
{#Include %soapif (obj = "") {s obj = ##class(MyApp.Person).%OpenId(1)}//从此启用XML的对象创建流set writer = ##class(%XML.Writer).%New()set stream = ##class(%GlobalCharacterStream).%New()set status = writer.OutputToStream(stream)if $$$ISERR(status) {do $System.Status.DisplayError(status) quit }set status = writer.RootObject(obj)if $$$ISERR(status) {do $System.Status.DisplayError(status) quit }do stream.Rewind()set container = ..%New()             ; 这就是我们要写出的对象set cred = ##class(%SYS.X509Credentials).GetByAlias("servercred")set parts  =$$$SOAPWSIncludeNoneset ref = $$$KeyInfoX509Certificateset key = ##class(%XML.Security.EncryptedKey).CreateX509(cred, parts, ref)set container.Key = key        ; 这个细节取决于类//需要创建一个键列表(本例中仅为一个)set keys = ##class(%Collection.ListOfObj).%New()do keys.Insert(key)set encdata = ##class(%XML.Security.EncryptedData).%New()set status = encdata.EncryptStream(stream, keys)set container.Data = encdata   ; 这个细节取决于类// 为容器写输出set writer = ##class(%XML.Writer).%New()set writer.Indent = 1if (filename'="") {set status = writer.OutputToFile(filename)if $$$ISERR(status) {do $system.OBJ.DisplayError(status) quit}}set status = writer.RootObject(container)if $$$ISERR(status) {do $system.OBJ.DisplayError(status) quit}
}

此方法可以接受任何启用XML的类的OREF;如果没有提供,则使用默认值。

解密加密的XML文件

解密的前提条件

在解密加密的XML文档之前,必须同时提供以下两项:

  • IRIS要使用的受信任证书。
  • IRIS凭据集,其私钥与加密中使用的公钥匹配。

解密文档

要解密加密的XML文档,请执行以下操作:

  1. 创建%XML.Reader实例打开并使用它打开文档。
  2. 获取Document属性,%XML.Reader实例。
    其中包含作为DOM的XML文档。
  3. 使用阅读器的correlation()方法将<EncryptedKey>元素或元素与类%XML.Security.EncryptedKey关联起来。
    例如:
 do reader.Correlate("EncryptedKey","%XML.Security.EncryptedKey")
  1. 遍历文档以读取<EncryptedKey>元素或多个元素。
    为此,可以使用阅读器的Next()方法,该方法通过引用返回一个导入的对象(如果有的话)。
    例如:
if 'reader.Next(.ikey,.status) {write !,"Unable to import key",!do $system.OBJ.DisplayError(status)quit}

导入的对象是%XML.Security.EncryptedKey的实例。

  1. 创建%Library.ListOfObjects的实例。
    并使用它的Insert()方法插入%XML.Security.EncryptedKey的实例。
    刚从文档中获得的。

  2. 调用类%XML.Security.EncryptedDataValidateDocument()方法

 set status=##class(%XML.Security.EncryptedData).ValidateDocument(.doc,keys)

第一个参数(通过引用返回)是在第2步中检索到的DOM的修改版本。
第二个参数是上一步中的键列表。

  1. 可以选择使用%XML.Writer为修改后的DOM生成输出。

例如,前面显示的CONTAINER类包含以下类方法:

ClassMethod DecryptDoc(filename As %String)
{#Include %soapset reader = ##class(%XML.Reader).%New()set status = reader.OpenFile(filename)if $$$ISERR(status) {do $System.Status.DisplayError(status) quit }set doc = reader.Document//获取<Signature>元素do reader.Correlate("EncryptedKey","%XML.Security.EncryptedKey")if 'reader.Next(.ikey,.status) {write !,"无法导入密钥",!do $system.OBJ.DisplayError(status)quit}set keys = ##class(%Collection.ListOfObj).%New()do keys.Insert(ikey)// 以下步骤返回解密的文档set status = ##class(%XML.Security.EncryptedData).ValidateDocument(.doc,keys)set writer = ##class(%XML.Writer).%New()set writer.Indent = 1do writer.Document(doc)quit $$$OK
}

第十七章 加密XML文档相关推荐

  1. 第十三章、C#操作XML文档(XmlDocument、XmlNode、XmlAttribute、SelectSingleNode、SelectNodes、XmlNodeList)...

    XML文档是一种通用的文档,这种文档既可以用.config作为后缀也可以用.xml作为后缀.XML文档主要由元素节点和节点的属性共同构成的.它有且仅有一个根节点,其他的节点全部都是根节点的子节点或者子 ...

  2. 如何:修改 Office Open XML 文档【转载】

    全文转载自:http://msdn.microsoft.com/zh-cn/library/bb669125.aspx 本主题显演示一个打开.修改和保存 Office Open XML 文档的示例. ...

  3. XML——文档类型定义(DTD-Document Type Definition)

    [0]README 0.1)本文文字描述转自 core java volume 2 , 旨在理解 XML--文档类型定义(DTD-Document Type Definition) 的基础知识: 0. ...

  4. 《软件需求分析(第二版)》第 10 章——编写需求文档 重点部分总结

    文章目录 前言 一.单选题 二.简答题 三.名词解释 总结 前言 软件需求分析就是把软件计划期间建立的软件可行性分析求精和细化,分析各种可能的解法,并且分配给各个软件元素.需求分析是软件定义阶段中的最 ...

  5. html5 xml文本编辑,简介XML文档的阅读与编辑

    阅读器以使用简单的文本编辑器或者任意浏览器查看 XML 文档.大多数主流浏览器都支持 XML.可以通过双击 XML 文档(如果是一个本地文件)或者在地址栏输入 URL 路径(如果文件位于服务器上)的方 ...

  6. 【Win 10应用开发】Adaptive磁贴模板的XML文档结构

    原文:[Win 10应用开发]Adaptive磁贴模板的XML文档结构 在若干天之前,老周给大家讲了Adaptive Toast通知的XML模板,所以相应地,今天老周给大家介绍一下Adaptive磁贴 ...

  7. 一个形式良好的XML文档

    一个"形式良好"的XML文档会遵守前几章介绍过的XML语法规则:  XML文档必须有根元素:  XML文档必须有关闭标签:  XML标签对大小写敏感:  XML元素必须被正 ...

  8. XML第二讲:格式正规的XML文档、XML文档的元素、属性、实体深度详解

    1. 对比XML与HTML下图所示: 从图中可以很好的判断出XML的优越性,XML更能显示出清晰的数据结构信息 2. XML与 HTML的区别 1) 元标记:表示从标记上面就可以描述内容本身是什么,比 ...

  9. xml文档规则_避免文档陷阱的7条规则

    xml文档规则 在开源社区中,英语是通用语言 . 为了降低翻译成本,许多团队已将英语作为其文档的源语言. 但是令人惊讶的是,为国际读者使用英语写作并不一定会使以英语为母语的人处于更好的位置. 相反,他 ...

最新文章

  1. 10 行代码玩转 NumPy!
  2. java 输入输出头文件_引入的标准头文件与标准输出以及FOR循环
  3. 骚操作!有了这款神器,轻轻松松用Python写APP!(文末彩蛋)
  4. maven profile实现多环境构建 (单项目多套配置)
  5. win7 绑定arp
  6. JBOSS7启动与关闭
  7. Visual Studio 宏
  8. 我的域控是不是被攻击了?吓!
  9. 18-CSS问题-让多个div横排显示并设置间距解决方案
  10. HIve的概念,发展,历史,部署,入门,加载数据
  11. 【编程】概念的理解 —— socket
  12. 5G来临,一对一直播社交源码如何利用热门机制吸引万千用户?
  13. Java学习之InputStream中read()与read(byte[] b)
  14. 2021-2022年数学建模资料汇总——数学模型篇
  15. 大数据开发离线计算框架知识点总结
  16. Linux下kafka之C/C++客户端库librdkafka的编译,安装以及函数介绍
  17. 计算机网络之子网掩码,子网掩码
  18. 凉宫春日的忧郁第五章
  19. mysql经典sql语句大全_经典SQL语句大全(sql查询语句大全集锦)
  20. 前端开发都有什么编程语言?

热门文章

  1. 神秘的 Allocator
  2. 关于python 关于面向对象 关于magic method(魔方方法)
  3. tomcat连接池的配置与使用
  4. (转载)OpenNI最新安装教程(图文教程)
  5. golang常见面试题总结
  6. 思想的沉淀,精辟,杨澜如是说
  7. 几款主流快速开发平台比较
  8. 利用C51单片机模拟SPI进行双机通信
  9. Ik分词器(自定义分词-mysql)
  10. 下一代共识机制探究——基于DAG的BFT共识