第二十三章 加密安全标头元素

文章目录

第二十三章 加密安全标头元素

本主题介绍如何加密 Web 服务和 Web 客户端发送的消息中的 WS-Security 标头内的元素。(此处描述的工具也可单独使用或与安全标头元素结合使用来加密 SOAP 主体。)

通常,会同时执行加密和签名。为简单起见,本主题仅介绍加密。有关结合加密和签名的信息,请参阅结合加密和签名。

使用派生密钥令牌进行加密和签名主题描述了加密 SOAP 消息部分内容的另一种方法。

加密安全标头元素

与上一主题中显示的加密技术不同,加密 WS-Security 标头元素的过程要求您指定 <EncryptedData> 元素如何连接到相应的 <EncryptedKey> 元素。

要加密安全标头元素,请执行以下操作:

  1. 可选择包含 %soap.inc 包含文件,它定义了可能需要使用的宏。
  2. 创建要加密的标头元素。例如:
java 复制代码
 set userToken=##class(%SOAP.Security.UsernameToken).Create("_SYSTEM","SYS")
  1. 获取包含将接收 SOAP 消息的实体的公钥的凭证集。请参阅以编程方式检索凭证集。
java 复制代码
 set credset=..SecurityIn.Signature.X509Credentials

请务必检查返回对象的类型,看它是否是 %SYS.X509Credential的实例,如以编程方式检索凭据集中所述。

  1. 根据凭证集创建加密密钥。为此,调用 %XML.Security.EncryptedKeyCreateX509() 类方法,并可选择指定第二个参数。例如:
java 复制代码
 set enckey=##class(%XML.Security.EncryptedKey).CreateX509(credset,$$$SOAPWSEncryptNone)

此方法生成一个对称密钥,返回 %XML.Security.EncryptedKey 的实例,该实例表示 <EncryptedKey> 标头元素。此标头元素包含对称密钥,由给定凭证集中的公钥加密。

第二个参数指定此密钥是否加密 SOAP 主体(除了密钥的任何其他用途之外)。值 $$$SOAPWSEncryptNone 表示此密钥不会用于加密 SOAP 主体。如果省略此参数,则 SOAP 主体也会被加密。

  1. 可选择修改加密密钥实例以使用不同的算法。请参阅指定块加密算法和指定密钥传输算法。
  2. 对于每个要加密的安全标头元素,根据该元素创建一个 <EncryptedData> 元素。为此,调用 %XML.Security.EncryptedDataCreate() 类方法。在此过程中,仅指定第二个参数,即要加密的安全标头元素。例如:
java 复制代码
 set encdata=##class(%XML.Security.EncryptedData).Create(,userToken)
  1. 对于 <EncryptedKey>,添加对 <EncryptedData> 元素的引用。对每个 <EncryptedData> 元素执行以下操作:

a. 调用 %XML.Security.DataReferenceCreate() 类方法并提供加密数据实例作为参数。

b. 调用加密密钥实例的 AddReference() 方法并提供数据引用作为参数。

java 复制代码
 set dataref=##class(%XML.Security.DataReference).Create(encdata)
 do enckey.AddReference(dataref)

此步骤更新加密密钥实例以包含指向加密数据实例的指针。

如果此 <EncryptedKey> 也加密 SOAP 主体,它会自动在 <Body> 中包含对 <EncryptedData> 元素的引用。

  1. <EncryptedKey> 元素添加到 WS-Security 标头元素。为此,请调用 Web 客户端或 Web 服务的 SecurityOut 属性的 AddSecurityElement() 方法。对于要添加的元素,指定 %XML.Security.EncryptedKey 的实例。
java 复制代码
 do ..SecurityOut.AddSecurityElement(enckey)
  1. 将加密的安全标头元素添加到 WS-Security 标头元素。为此,请调用 Web 客户端或 Web 服务的 SecurityOut 属性的 AddSecurityElement() 方法。在本例中,指定两个参数:

a. 要包含的安全标头元素(而不是基于该元素 %XML.Security.EncryptedData 的实例)。

b. 加密密钥实例。第二个参数指定第一个参数指定的项的放置位置。如果参数为 AB,则 IRIS 确保 AB 之后。指定此项以便收件人首先处理加密密钥,然后再处理依赖于它的加密安全标头元素。

java 复制代码
 do ..SecurityOut.AddSecurityElement(userToken,enckey)
相关推荐
子兮曰4 小时前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰4 小时前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万5 小时前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝5 小时前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋5 小时前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
这个DBA有点耶6 小时前
MVCC深入:Read View、版本链与快照读——InnoDB并发控制的内核
数据库·mysql·架构
DBA_G6 小时前
从地面到云霄:GBase数据库在民航三大场景的落地实践
数据库
卡布鲁6 小时前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
自由能燃气设备6 小时前
商用全预混低氮冷凝锅炉免费方案vs付费方案对比+选型避坑指南
大数据·数据库·人工智能
科创致远6 小时前
科创致远 ESOP 系统核心效能与实战价值展示
大数据·数据库·人工智能·精益工程