第三十章 使用派生密钥令牌进行加密和签名
IRIS
支持 WS-SecureConversation 1.4
定义的 <DerivedKeyToken>
元素。可以创建并使用<DerivedKeyToken>
元素进行加密和签名,作为前三个主题中描述的方法的替代。
通常,会同时执行加密和签名。为简单起见,本主题分别介绍这些任务。有关结合加密和签名的信息,请参阅结合加密和签名。
概述
<DerivedKeyToken>
元素旨在携带发送者和接收者可以独立使用的信息来生成相同的对称密钥。这些方可以使用该对称密钥对 SOAP
消息的指定部分进行加密、签名或同时执行这两种操作。
要生成和使用 <DerivedKeyToken>
,请执行以下操作:
- 生成一个对称密钥以供临时使用。
- 使用要向其发送消息的实体的公钥来加密对称密钥。这将创建一个
<EncryptedKey>
元素。
可以从该实体的请求消息中包含的 X.509
证书中获取公钥。或者可以提前获取它。
- 通过
P_SHA1
算法从原始对称密钥计算出一个新的对称密钥。
这将创建一个引用 <EncryptedKey>
元素的 <DerivedKeyToken>
元素。
- 使用新的对称密钥进行加密或签名。
对这些活动使用不同的对称密钥被认为是一种很好的做法,这样就可以减少用于分析的数据量。
- 在消息中包含
<EncryptedKey>
元素和<DerivedKeyToken>
。
在 IRIS
中,派生密钥令牌也可以基于另一个派生密钥令牌。
创建并添加 <DerivedKeyToken>
作为参考,本节描述了后面几节中需要的常见活动。它描述了如何创建 <DerivedKeyToken>
并将其添加到 WS-Security
标头。您可以使用以下步骤或各小节中描述的变体。
- 可选择包含
%soap.inc
包含文件,它定义了可能需要使用的宏。 - 获取要向其发送消息的实体的凭证集。请参阅以编程方式检索凭证集。
Set x509alias = "servernopassword"
Set credset = ##class(%SYS.X509Credentials).GetByAlias(x509alias)
- 根据凭证集创建加密密钥。为此,调用
%XML.Security.EncryptedKey
的CreateX509()
类方法,并将第二个参数指定为$$$SOAPWSEncryptNone
。例如:
set enckey=##class(%XML.Security.EncryptedKey).CreateX509(credset,$$$SOAPWSEncryptNone)
此方法生成一个对称密钥,并返回 %XML.Security.EncryptedKey
的实例,该实例表示 <EncryptedKey>
标头元素。此标头元素包含对称密钥,由给定凭证集中的公钥加密。
当创建加密密钥作为派生密钥的基础时,请始终指定 $$$SOAPWSEncryptNone
或 ""
作为 CreateX509()
的第二个参数。
-
可选择修改加密密钥实例以使用不同的算法。请参阅指定块加密算法和指定密钥传输算法。
-
将
<EncryptedKey>
元素添加到WS-Security
标头元素。为此,请调用Web
客户端或Web
服务的SecurityOut
属性的AddSecurityElement()
方法。对于要添加的元素,指定%XML.Security.EncryptedKey
的实例。
do ..SecurityOut.AddSecurityElement(enckey)
- 根据加密密钥创建派生密钥令牌。为此,调用
%SOAP.WSSC.DerivedKeyToken的 Create()
方法。此方法采用两个参数:
a. 作为基础使用的加密密钥。
b. 指定派生密钥如何引用该加密密钥的引用选项。在此基本过程中,使用 $$$SOAPWSReferenceEncryptedKey
set refopt=$$$SOAPWSReferenceEncryptedKey
set dkenc=##class(%SOAP.WSSC.DerivedKeyToken).Create(enckey,refopt)
此方法在返回代表 <DerivedKeyToken>元素的 %SOAP.WSSC.DerivedKeyToken
的实例。
- 将
&<DerivedKeyToken>
元素添加到WS-Security
标头元素。为此,请调用Web
客户端或Web
服务的SecurityOut
属性的AddSecurityElement()
方法。对于要添加的元素,指定%SOAP.WSSC.DerivedKeyToken
的实例。
do ..SecurityOut.AddSecurityElement(dkenc)
- 发送
SOAP
消息。请参阅添加安全标头元素中的一般注释。
网友评论