在采用轻量级移动设备的推动下,基于REST的通信的采用日益广泛,因此需要保护这些通信。 当消息包含信息有效负载时,尤其如此,通常将其格式化为JavaScript Object Notation(JSON)文本。
本文演示了如何使用运行6.0.1.0版或更高版本固件的WebSphere DataPower设备来加密JSON有效负载,以便使用REST标准进行传输。 这样可以保护与传输方法(例如SSL)无关的消息私密性。 我们将演示以下方法:
- 整个有效负载使用PKCS#7标准进行加密。
- 使用共享密钥对选定的元素进行加密。
- 所选元素使用非对称密钥(证书和密钥)进行加密。
传输的加密(或发送)端和传输的解密(或接收)端均在此进行了说明。
本文还演示了如何使用XQuery和JSONiq处理脚本来执行加密和解密。
您可以在传输的发送和接收端使用相同的多协议网关服务; 静态后端目标只需要调整。
先决条件
本文使用加密密钥和证书。 为了不间断地完成这些说明,您必须首先创建加密密钥和证书对象。
密钥和证书对
请按照以下说明创建必要的密钥和证书对象:
- 在导航窗格的搜索栏中键入
Ident
。 - 单击“ 加密标识凭证” 。
- 单击“ 添加”创建一个新的“身份凭证”对象。
- 在Name字段中输入
Jason
,如图1所示。 - 单击加密密钥下的+按钮。 一个新的窗口打开。
- 在名称字段中输入
Jason
。 - 上载加密密钥以完成此对象。 如果没有密钥,请使用设备上可用的加密工具来创建密钥。
- 点击应用 。 窗口关闭。
- 单击“身份证明”页面上“证书”下的+。 一个新的窗口打开。
- 在名称字段中输入
Jason
。 - 上载加密证书对象以完成此对象。 如果没有密钥,请使用设备上可用的加密工具来创建证书。
- 点击应用 。 窗口关闭。
- 单击“ 应用”以完成“加密标识凭证”对象。
图1.密码识别凭证
共享密钥
- 在导航窗格的搜索栏中键入
Shared
。 - 单击“ 加密共享密钥” 。
- 单击添加以创建新密钥。
- 在Name字段中输入
aes-128
,如图2所示。您必须使用此名称。 - 从“ 下载”部分的本文随附的材料中上载keyd.dat文件,或上载您自己的对称密钥。
- 点击应用 。
- 点击保存配置 。
图2.加密共享密钥
索取文件
这是本文使用的示例JSON文档:
{
"Name":"Cartoon Studios",
"AccountID":"8458jf8757275234",
"Social-no":"123-45-6789",
"State":"MA"
}
通过执行本文中的步骤,可以确保“ Social-no”元素的值。
创建目的地
本文中创建的服务使用的目的地仅返回服务发送的内容,就像镜像一样。 要创建这样的目的地,请按照下列步骤操作:
- 在导航栏的搜索字段中键入
HTTP
。 从出现的列表中选择HTTP服务 。 - 单击添加以创建新服务。
- 在名称字段中输入
Mirror
。 - 将端口号更改为
2049
。 - 将模式更改为echo 。
- 点击应用 。
- 点击保存配置 。
测试配置
完成此处描述的每个处理规则后,您可以通过向网关发送请求来测试新规则。
要测试加密规则,请将纯JSON有效负载request.jsn发送到网关。 例如,这是curl命令:
curl –data-binary @request.jsn http://dp_addr:3333/ssn
要测试解密规则,首先需要创建一个加密的有效负载。 您可以通过捕获加密规则的输出来做到这一点。 这是使用curl的示例:
curl –data-binary @request.jsn http://dp_addr:3333/ssn > request-enc.jsn
curl –data-binary @request-enc.jsn http://dp_addr:3333/dssn
调试配置
将应用程序域系统日志级别设置为“调试”,以捕获默认系统日志中的所有可能的调试条目。 为此,请单击控制面板上的“ 故障排除”图标。 在“ 日志记录”下 ,从“ 日志级别”下拉列表中选择“ 调试 ”。 然后单击“ 日志级别”按钮。
配置多协议网关服务
此处演示的所有方法都使用多协议网关服务来完成工作。 本节介绍此服务的配置(图3),除了“处理策略”。
- 在导航窗格上的搜索栏中键入
Multi
。 - 从可能的条目列表中选择New MultiProtocol Gateway 。
- 输入或选择以下值:
- 名称:
SecureJSON
- 预设后端网址:
http://127.0.0.1:2049
:http://127.0.0.1:2049
:http://127.0.0.1:2049
- 响应类型:直通
- 请求类型:非XML
图3.多协议网关初始配置
- 名称:
- 在多协议网关的“ 高级”选项卡上(图4),将Proxy HTTP Response设置为On 。 返回到“ 常规”选项卡。
图4.“多协议网关高级”选项卡
前端协议处理程序
- 在“ 前端协议”下 ,单击“ +”创建一个新的处理程序。 从出现的列表中选择HTTP前端处理程序 。 在打开的“ 配置HTTP前端处理程序”窗口中,设置以下值(图5):
- 名称:
HTTP3333
- 端口号:
3333
- 允许的方法:单击以将GET方法添加到默认列表。
图5.前端协议处理程序
- 名称:
完成临时配置
- 在“ 多协议网关策略”下 ,选择“ 默认” 。 该策略只是网关完成时使用的占位符。
- 单击“ 应用”以应用新网关的设置。
- 点击保存配置 。
处理策略配置
此处详细介绍了将加密应用于JSON有效负载的三种方法。 您可能只想执行与要使用的方法有关的那些步骤。
请注意,网关配置使用非XML的请求类型来允许PKCS#7解密规则成功运行。 如果您不打算使用此规则,则可以将网关配置请求类型设置为JSON 。 这会使设备自动检查请求文档,以确保文档格式正确。 这对于探针也更有效。
PKCS#7加密
- 在“ 多协议网关策略”下 ,单击+创建新策略。
- 输入
SecureJSON
作为策略的名称 ,如图6所示。 - 点击新建规则 。
- 将规则的名称更改为
SecureJSON_rule_pk7encrypt
。 - 将“ 规则方向”设置为“ 客户端到服务器” 。
- 双击突出显示的“ 匹配操作”图标。
图6.初始处理策略
- 单击+创建一个新的匹配。
- 在Name字段中输入
ebin
,如图7所示。 - 单击匹配规则选项卡。
- 点击添加 。
- 在URL匹配字段中输入
*/ebin
。 - 点击应用 。 窗口关闭。 新规则输入到网格中。
图7. ebin匹配规则
- 点击应用 。 窗口关闭。
- 单击完成 。 窗口关闭。 蓝色的“处理策略”窗格再次处于活动状态(图8)。
图8.匹配动作
- 将高级操作图标拖动到处理行上。
- 双击图标。
- 从可能的操作类型列表中选择Crypto Binary ,如图9所示。
图9.选择加密二进制高级操作
- 单击下一步 。 一个新的窗口打开。
- 从可能的操作列表中选择PKCS#7 Encrypt ,如图10所示。
- 从“ 收件人 ”列表中选择所需的证书,然后单击“ 添加” 。
图10. PKCS#7加密
- 单击完成 。 窗口关闭。
图11. PKCS#7加密策略
- 单击Apply Policy ,如图11所示。 如果这完成了所需的策略配置,请单击“ 关闭窗口”以关闭“处理策略”窗口。 然后在“网关”页面上单击“ 应用 ”。
当您向该规则提交样本请求文档时,您应该收到与以下内容相似的结果:
---BEGIN PKCS7----- MIIByQYJKoZIhvcNAQcDoIIBujCCAbYCAQAxgeAwgd0CAQAwRjA6MQswCQYDVQQG EwJVUzELMAkGA1UECBMCTUExDjAMBgNVBAcTBUtUb3duMQ4wDAYDVQQDEwVKYXNv bgIIBImBLUcGRo8wDQYJKoZIhvcNAQEBBQAEgYCHrd/qNEtgGZpXDK8yFLP65lO2 yRVtIst3E/hOqFy4Jt2YWtfsjLP2nuL27fEv3C+iLQSQo5leJCBaWF83xqUb4rMA I+1/8+T19ciEm5u7JhPAJ17G2Ypd1jqquXeVeJq6Mo1jYqTKjMt+2ir8ijhhuX6/ JzOIa+cAznBOD4+uaDCBzQYJKoZIhvcNAQcBMB0GCWCGSAFlAwQBAgQQ2LCVsgxa 6alYZyGem0he2oCBoDbUr0nPULErHNfrk2twhBaPZzae3KUF07RYddamwBWBRkJe 7/Z4QU9WR8n/GoPe0vq6gsxHAaGqWCBoI0HCY+YTV6aF7ARlg5n2bVHKEx8lsH6G fxWwoKJu6j/BSmJCcoYaJNc5fATxr8mFKMJV1GcQg666hwzx143GkcAHmaclXu9w awpqndNhpKAukj6vxWUU8aAr8AehRRYaFXWoYf4= -----END PKCS7-----
整个有效负载已加密。 将此结果保存在本地文件中,以提交解密此有效负载的规则,这将在下一部分中进行描述。
PKCS#7解密
- 点击新建规则 。
- 将规则的名称更改为
SecureJSON_rule_pk7decrypt
。 - 将“ 规则方向”设置为“ 客户端到服务器” 。
- 双击突出显示的“ 匹配操作”图标。
- 单击+创建一个新的匹配。
- 在Name字段中输入
dbin
,如图12所示。 - 单击匹配规则选项卡。
- 点击添加 。
- 在URL匹配字段中输入
*/dbin
。 - 点击应用 。 窗口关闭。 新规则输入到网格中。
图12. dbin匹配规则
- 点击应用 。 窗口关闭。
- 单击完成 。 窗口关闭。 蓝色的“处理策略”窗格再次处于活动状态。
- 将高级操作图标拖动到处理行上。
- 双击图标。
- 从可能的操作类型列表中选择“ 加密二进制 ”。
- 单击下一步 。 一个新的窗口打开。
- 从可能的操作列表中选择PKCS#7 Decrypt ,如图13所示。
- 从“ 输入编码格式 ”列表中选择PEM 。
- 从“ 输出编码格式 ”列表中选择“ 无 ”。
- 从收件人列表中选择所需的加密标识凭据,然后单击添加 。
图13. PKCS#7解密
- 单击完成 。 窗口关闭。
- 单击“ 应用策略” 。 如果这完成了所需的策略配置,请单击“ 关闭窗口”以关闭“处理策略”窗口。 然后在“网关”页面上单击“ 应用 ”。
如果提交上面构造的用于加密JSON有效负载的规则的结果,则应该再次收到原始的纯文本JSON文档。
{ "Name":"Cartoon Studios", "AccountID":"8458jf8757275234", "Social-no":"123-45-6789", "State":"MA" }
使用共享密钥进行元素加密
您必须创建一个共享密钥加密对象才能使用此方法。 如果尚未创建共享密钥,请按照“ 共享密钥”部分中的说明进行操作。
请按照以下步骤使用共享密钥来加密JSON有效内容的元素:
- 单击新规则。
- 将规则名称更改为
SecureJSON_rule_ssencrypt.
- 将“ 规则方向”设置为“ 客户端到服务器” 。
- 双击突出显示的“ 匹配操作”图标。
- 点击+创建新的匹配
- 在名称字段中输入
ssn
。 - 单击匹配规则选项卡。
- 点击添加 。
- 在URL匹配字段中输入
*/ssn
。 - 点击应用 。 窗口关闭。 新规则输入到网格中,如图14所示。
图14. ssn匹配规则
- 点击应用 。 窗口关闭。
- 单击完成 。 窗口关闭。 蓝色的“处理策略”窗格再次处于活动状态。
- 将“ 变换”图标拖到处理行上。
- 双击图标。
- 在“ 使用文档处理说明”下 ,选择“使用处理控制文件转换”(如果指定) 。
- 输入语言应为JSON , 转换语言应为Xquery 。
- 单击Processing Control文件下的Upload按钮,然后上载set-dp-var.xq文件,如图15所示。
图15.配置Xquery转换
- 单击完成 。 窗口关闭。 Processing Policy窗口重新获得焦点,如图16所示。
图16.共享机密加密策略-第一步
这是set-dp-var.xq文件的内容:
declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization"; declare namespace dp = "http://www.datapower.com/extensions"; declare option jsoniq-version "0.4.42"; declare option output:method "json"; let $ssn := .("Social-no") let $dono := dp:set-variable("var://context/mine/myvar1", $ssn) let $myvar := dp:variable("var://context/mine/myvar1") return jn:object( for $key in jn:keys(.) let $val := if ($key = "Social-no") then $myvar else .($key) return { $key : $val } )
该脚本从提交的消息中提取Social-no JSON元素的值,将其放在DataPower变量中,然后使用相同的变量再次输出消息。 此转换的输出并不重要; 最重要的是DataPower变量的设置。 在处理策略的下一步中使用此变量。
- 将另一个变换动作拖到“处理规则”上。
- 双击图标。
- 在“ 使用文档处理说明”下 ,选择“使用XSLT样式表转换” ,如图17所示。
- 上载string-crypto-var.xsl文件。
- 将输出上下文设置为NULL 。
图17.配置Transform XSLT
- 单击完成 。 窗口关闭。
此样式表检索上一步中设置的DataPower变量的值,使用共享密钥对其进行加密,然后将结果放入DataPower变量中,如下所示:
<xsl:output method="xml"/> <xsl:template match="/"> <xsl:variable name="ssn"> <xsl:value-of select="dp:variable('var://context/mine/myvar1')" /> </xsl:variable> <xsl:variable name="result" select="dp:encrypt-string ('http://www.w3.org/2001/04/xmlenc#aes128-cbc', 'name:aes-128', $ssn)" /> <dp:set-variable name="'var://context/mine/myvar2'" value="$result" /> <output> <xsl:value-of select ="$result" /> </output> </xsl:template>
再一次,此转换的输出并不重要。 变量值的设置很重要。
- 最后将“ 变换”动作拖到“处理规则”上。
- 双击图标。
- 在“ 使用文档处理说明”下 ,选择“使用处理控制文件转换”(如果已指定 ,如图18所示)。
- 输入语言应为JSON , 转换语言应为Xquery 。
- 单击“ 处理控制文件”下的“上载”按钮,然后上载use-dp-var.xq文件。
- 将输入设置为INPUT 。
- 将输出设置为OUTPUT 。
- 单击完成 。 窗口关闭。
图18.使用XQuery进行转换
这是use-dp-var.xq文件的内容:
declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization"; declare namespace dp = "http://www.datapower.com/extensions"; declare option jsoniq-version "0.4.42"; declare option output:method "json"; let $ssn := .("Social-no") let $myvar := dp:variable("var://context/mine/myvar2") return jn:object( for $key in jn:keys(.) let $val := if ($key = "Social-no") then $myvar else .($key) return { $key : $val } )
该脚本输出原始消息,用加密的字段值代替原始值。
- 单击“ 应用策略” 。 如果这完成了所需的策略配置,请单击“ 关闭窗口”以关闭“处理策略”窗口。 然后在“网关”页面上单击“ 应用 ”。
如果您通过此规则提交样本文档进行加密,则响应类似于以下内容:
{ "State":"MA", "AccountID":"8458jf8757275234", "Social-no":"RynTyS5R0hTDDT7e/3OfK0ItyC4rCxZQr8a3D2yITck=", "Name":"Cartoon Studios" }
使用共享密钥进行元素解密
请按照以下步骤使用共享密钥来解密JSON有效负载的元素:
- 点击新建规则 。
- 将规则的名称更改为SecureJSON_rule_ssdecrypt 。
- 将“ 规则方向”设置为“ 客户端到服务器” 。
- 双击突出显示的“匹配操作”图标。
- 单击+创建一个新的匹配。
- 在Name字段中输入
dssn
,如图19所示。 - 单击匹配规则选项卡。
- 点击添加 。
- 在URL Match字段中输入
*/dssn
。 - 点击应用 。 窗口关闭。 新规则输入到网格中。
图19.配置匹配规则
- 点击应用 。 窗口关闭。
- 单击完成 。 窗口关闭。 蓝色的“处理策略”窗格再次处于活动状态。
- 将“ 变换”图标拖到处理行上。
- 双击图标。
- 在“ 使用文档处理说明”下 ,选择“使用处理控制文件转换”(如果已指定 ,如图20所示)。
- 输入语言应为JSON , 转换语言应为Xquery 。
- 在“ 处理控制文件”下 ,选择set-dp-var.xq文件。
图20.使用XQuery进行转换
- 单击完成 。 窗口关闭。 图21显示了此时的处理策略规则。
图21.处理策略
这是set-dp-var.xq文件的内容:
declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization"; declare namespace dp = "http://www.datapower.com/extensions"; declare option jsoniq-version "0.4.42"; declare option output:method "json"; let $ssn := .("Social-no") let $dono := dp:set-variable("var://context/mine/myvar1", $ssn) let $myvar := dp:variable("var://context/mine/myvar1") return jn:object( for $key in jn:keys(.) let $val := if ($key = "Social-no") then $myvar else .($key) return { $key : $val } )
该脚本从提交的消息中提取Social-no JSON元素的值,将其放在DataPower变量中,然后使用相同的变量再次输出消息。 此转换的输出并不重要; 最重要的是DataPower变量的设置。 在处理策略的下一步中使用此变量。
- 将另一个变换动作拖到“处理规则”上。
- 双击图标。
- 在“ 使用文档处理说明”下 ,选择“使用XSLT样式表转换” ,如图22所示。
- 上载string-crypto-var-dec.xsl文件。
- 在输出上下文字段中输入
NULL
。图22.配置XSLT转换
- 单击完成 。 窗口关闭。
此样式表检索上一步中设置的DataPower变量的值,使用共享的secred密钥对其解密,然后将结果放入DataPower变量中,如下所示:
<xsl:output method="xml"/> <xsl:template match="/"> <xsl:variable name="ssn"> <xsl:value-of select="dp:variable('var://context/mine/myvar1')" /> </xsl:variable> <xsl:variable name="result" select="dp:decrypt-data ('http://www.w3.org/2001/04/xmlenc#aes128-cbc', 'name:aes-128', $ssn)" /> <dp:set-variable name="'var://context/mine/myvar2'" value="$result" /> <output> <xsl:value-of select ="$result" /> </output> </xsl:template>
再一次,此转换的输出并不重要。 变量值的设置很重要。
- 最后将“ 变换”动作拖到“处理规则”上。
- 双击图标。
- 在“ 使用文档处理说明”下 ,选择“使用处理控制文件转换”(如果指定的话) ,如图23所示。
- 输入语言应为JSON , 转换语言应为Xquery 。
- 在“ 处理控制文件”下 ,选择use-dp-var.xq文件。
- 将输入设置为INPUT 。
- 将输出设置为OUTPUT 。
图23.配置XQuery转换
- 单击完成 。 窗口关闭。
这是use-dp-var.xq文件的内容:
declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization"; declare namespace dp = "http://www.datapower.com/extensions"; declare option jsoniq-version "0.4.42"; declare option output:method "json"; let $ssn := .("Social-no") let $myvar := dp:variable("var://context/mine/myvar2") return jn:object( for $key in jn:keys(.) let $val := if ($key = "Social-no") then $myvar else .($key) return { $key : $val } )
该脚本输出原始消息,用未加密的字段值代替加密的值(图24)。
图24.完成的解密策略
- 单击“ 应用策略” 。 如果这完成了所需的策略配置,请单击“ 关闭窗口”以关闭“处理策略”窗口。 然后在“网关”页面上单击“ 应用 ”。
如果您提交使用共享密钥加密的有效负载,则将返回原始JSON文档。
{ "Name":"Cartoon Studios", "AccountID":"8458jf8757275234", "Social-no":"123-45-6789", "State":"MA" }
使用非对称密钥进行元素加密
此方法需要使用加密密钥和证书。 如果尚未创建密钥对象,请按照“ 密钥和证书对”部分中的说明进行操作。
- 点击新建规则 。
- 将规则的名称更改为
SecureJSON_rule_asencrypt
。 - 将“ 规则方向”设置为“ 客户端到服务器” 。
- 双击突出显示的“ 匹配操作”图标。
- 单击+创建一个新的匹配。
- 在名称字段中输入
ssna
。 - 单击匹配规则选项卡。
- 点击添加 。
- 在“ URL匹配”字段中输入
*/ssna
。 - 点击应用 。 窗口关闭。 新规则将输入到网格中,如图25所示。
图25.配置匹配规则
- 点击应用 。 窗口关闭。
- 单击完成 。 窗口关闭。 蓝色的“处理策略”窗格再次处于活动状态。
- 最后将“ 变换”动作拖到“处理规则”上。
- 双击图标。
- 在“ 使用文档处理说明”下 ,选择“使用处理控制文件转换”(如果指定) 。
- 输入语言应为JSON , 转换语言应为Xquery 。
- 单击“ 处理控制文件”下的“上载”按钮,然后上载extract-ssn-output.xq文件。
- 单击完成 。 窗口关闭。
这是extract-ssn-output.xq文件的内容:
declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization"; declare namespace dp = "http://www.datapower.com/extensions"; declare option jsoniq-version "0.4.42"; declare option output:method "xml"; let $ssn := .("Social-no") return <output> {$ssn} </output>
该脚本从JSON请求中提取Social-no元素的值,并将其包装为XML。 在这种情况下,脚本的输出很重要。 此XML输出在下一步操作中被加密。
图26.处理策略
- 将Encrypt图标(图26)拖到处理行上。
- 双击图标。 一个新的窗口打开。
- 将信封方法设置为标准XML加密 。
- 将消息类型设置为Raw XML Document 。
- 使用收件人证书Jason ,如图27所示。
图27.配置加密操作
- 单击完成 。
图28.处理策略
为了在JSON消息中通过网络传输加密的值,必须对加密的数据块进行URL编码。 下一个动作将执行此任务。
- 将“ 变换动作” (图28)拖到“处理规则”上。
- 双击图标。
- 在“ 使用文档处理说明”下 ,选择“使用XSLT样式表转换” ,如图29所示。
- 上载urlencode.xsl文件。
- 将输出设置为NULL 。
图29.配置XSLT转换
该样式表在PIPE上下文中检索Encrypted Data XML,对其进行URL编码以进行传输,然后将结果放入DataPower变量中。 输出并不重要。
<xsl:output method="xml"/> <xsl:template match="/"> <xsl:variable name="thisdoc"> <dp:serialize select="." /> </xsl:variable> <xsl:variable name="coded" select="dp:encode($thisdoc, 'url')" /> <dp:set-variable name="'var://context/mine/encrypted'" value="$coded" /> <output> <xsl:copy-of select="$coded" /> </output> </xsl:template>
- 最后将“ 变换”动作拖到“处理规则”上。
- 双击图标。
- 在“ 使用文档处理说明”下 ,选择“使用处理控制文件转换”(如果指定) 。
- 输入语言应为JSON , 转换语言应为Xquery 。
- 点击上传下的处理控制文件,并上传使用加密-var.xq文件。
- 将Input上下文设置为INPUT ,如图30所示。
- 将输出上下文设置为OUTPUT 。
图30.配置最终的XQuery转换
- 单击完成 。 窗口关闭。 图31显示了已完成的处理策略规则。
图31.完成的处理规则
这是use-encrypted-var.xq文件的内容:
declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization"; declare namespace dp = "http://www.datapower.com/extensions"; declare option jsoniq-version "0.4.42"; declare option output:method "json"; let $ssn := .("Social-no") let $myvar := dp:variable("var://context/mine/encrypted") return jn:object( for $key in jn:keys(.) let $val := if ($key = "Social-no") then $myvar else .($key) return { $key : $val } )
该脚本输出原始消息,用加密的数据替换Social-no元素。
- 单击“ 应用策略” 。 如果这完成了所需的策略配置,请单击“ 关闭窗口”以关闭“处理策略”窗口。 然后在“网关”页面上单击“ 应用 ”。
如果使用此规则将示例JSON文档提交到网关,则将返回部分加密的文档,如下所示:
{ "State":"MA", "AccountID":"8458jf8757275234", "Social-no":"%3C%3Fxml+version%3D%221.0%22+encoding%3D%22UTF-8%22%3F%3E%0A%3Cxenc %3AEncryptedData+Type%3D%22http%3A%2F%2Fwww.w3.org%2F2001%2F04%2Fxmlenc%23Element%22+xmlns%3Axenc %3D%22http%3A%2F%2Fwww.w3.org%2F2001%2F04%2Fxmlenc%23%22%3E%3Cxenc%3AEncryptionMethod+Algorithm %3D%22http%3A%2F%2Fwww.w3.org%2F2001%2F04%2Fxmlenc%23tripledes-cbc%22%2F%3E%3Cdsig%3AKeyInfo+xmlns %3Adsig%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2F09%2Fxmldsig%23%22%3E%3Cxenc%3AEncryptedKey+Recipient %3D%22name%3AJason%22%3E%3Cxenc%3AEncryptionMethod+Algorithm%3D%22http%3A%2F%2Fwww.w3.org%2F2001 %2F04%2Fxmlenc%23rsa-1_5%22%2F%3E%3Cdsig%3AKeyInfo%3E%3Cdsig%3AKeyName%3EJason%3C%2Fdsig%3AKeyName %3E%3C%2Fdsig%3AKeyInfo%3E%3Cxenc%3ACipherData%3E%3Cxenc%3ACipherValue%3EYCbZxpgATnTDySkvoJPJEP %2BQfqo323mNnozEUxarFohagST06iY4R%2FuwFPsnQEAIVQbmQqxnvUJ3qA63DtBg4GXAEvAPdgyl1947qU8qtDJzTzLixEM7BE7H %2B7ITTDbPiUm6ZslhYe4hvhWYa441AqaA8tdMCL2e5MhcWliTK4Y%3D%3C%2Fxenc%3ACipherValue%3E%3C%2Fxenc %3ACipherData%3E%3C%2Fxenc%3AEncryptedKey%3E%3C%2Fdsig%3AKeyInfo%3E%3Cxenc%3ACipherData%3E%3Cxenc %3ACipherValue%3EhN7LmbrYWJuEM3hFQYjvXua2p%2FtjnQsgto6vQ%2F1HgzEd5SmjLlH5PgL%2FYCop1MSJPiWI9bO %2BYpl811Hi63gO9M3uf7H73%2F8CLTbKjQWkPvuTX0CkGP7LtHMgPGxLvHZxJpusGBN5f6A%3D%3C%2Fxenc%3ACipherValue %3E%3C%2Fxenc%3ACipherData%3E%3C%2Fxenc%3AEncryptedData%3E", "Name":"Cartoon Studios" }
使用非对称密钥进行元素解密
- 点击新建规则 。
- 将规则的名称更改为SecureJSON_rule_asdecrypt 。
- 将“ 规则方向”设置为“ 客户端到服务器” 。
- 双击突出显示的“ 匹配操作”图标。
- 单击+创建一个新的Match 。
- 在名称字段中输入
assn
。 - 单击匹配规则选项卡。
- 点击添加 。
- 在URL匹配字段中输入
*/assn
。 - 点击应用 。 窗口关闭。 新规则将输入到网格中,如图32所示。
图32.配置匹配规则
- 点击应用 。 窗口关闭。
- 单击完成 。 窗口关闭。 蓝色的“处理策略”窗格再次处于活动状态。
- 最后将“ 变换”动作拖到“处理规则”上。
- 双击图标。
- 在“ 使用文档处理说明”下 ,选择“使用处理控制文件转换”(如果指定的话) ,如图33所示。
- 输入语言应为JSON , 转换语言应为Xquery 。
- 单击“ 处理控制文件”下的“上载”按钮,然后上载set-dpvar-encrypted.xq文件。
图33.配置XQuery转换
- 单击完成 。 窗口关闭。 到目前为止,图34显示了处理策略规则。
图34.处理规则
这是set-dpvar-encrypted.xq文件的内容:
declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization"; declare namespace dp = "http://www.datapower.com/extensions"; declare option jsoniq-version "0.4.42"; declare option output:method "xml"; let $ssn := .("Social-no") let $dono := dp:set-variable("var://context/mine/encrypted", $ssn) return <output> {$ssn} </output>
在这种情况下,输出并不重要; 设置变量很重要。 下一个动作将使用它。
- 将“ 变换”动作拖到“处理规则”上。
- 双击图标。
- 在“ 使用文档处理说明”下 ,选择“使用XSLT样式表转换” ,如图35所示。
- 上载urldecode-var.xsl文件。
- 在“ 输出上下文”字段中输入
posted
的类型。图35.配置XSLT转换
- 单击完成 。 窗口关闭。
此样式表的输出很重要。 I由其后的Decrypt操作使用。
这是样式表:
<xsl:output method="xml"/> <xsl:template match="/"> <xsl:variable name="ssn"> <xsl:value-of select="dp:variable('var://context/mine/encrypted')" /> </xsl:variable> <xsl:variable name="decode"> <xsl:value-of select="dp:decode($ssn, 'url')" /> </xsl:variable> <xsl:copy-of select="dp:parse($decode)" /> </xsl:template>
- 将解密图标拖到处理行上。
- 双击图标。 一个新的窗口打开。
- 从可能的Input上下文中选择发布 ,如图36所示。
- 将消息类型设置为整个文档 。
- 使用解密密钥 Jason 。
- 在输出上下文字段中输入
outdata
。图36.配置解密操作
- 单击完成 。
解密后的数据现在位于outdata上下文中。 下一步操作将使用此输入,并将数据放在DataPower变量中,以备后用。
- 将“ 变换”动作拖到“处理规则”上。
- 双击图标。
- 从可能的Input上下文列表中选择outdata ,如图37所示。
- 在“ 使用文档处理说明”下 ,选择“使用XSLT样式表转换” 。
- 上载make-decoded-var.xsl文件。
- 在输出上下文中输入
relegate
。图37.配置XSLT转换
- 单击完成 。 窗口关闭。 图38显示了到目前为止的处理策略规则。
图38.处理规则
此样式表的输出并不重要; 设置变量很重要。
这是样式表:
<xsl:output method="text"/> <xsl:template match="/"> <dp:set-variable name="'var://context/mine/decoded'" value="/output/text()" /> <xsl:copy-of select="/output/text()" /> </xsl:template>
- 最后将“ 变换”动作拖到“处理规则”上。
- 双击图标。
- 从可能的Input上下文列表中选择INPUT ,如图39所示。
- 在“ 使用文档处理说明”下 ,选择“使用处理控制文件转换”(如果指定) 。
- 输入语言应为JSON , 转换语言应为Xquery 。
- 单击“ 处理控制文件”下的“上载”按钮,然后上载use-decoded-var.xq文件。
- 从可能的输出上下文列表中选择输出 。
图39.配置XQuery转换
- 单击完成 。 窗口关闭。
- 单击“ 应用策略” 。 如果这完成了所需的策略配置,请单击“ 关闭窗口”以关闭“处理策略”窗口。 然后在“网关”页面上单击“ 应用 ”。
这是use-decoded-var.xq文件的内容:
let $ssn := .("Social-no") let $myvar := dp:variable("var://context/mine/decoded") cast as xs:string return jn:object( for $key in jn:keys(.) let $val := if ($key = "Social-no") then $myvar else .($key) return { $key : $val } )
该文件输出未加密的消息。 如果将使用非对称密钥加密的有效负载提交给网关,则会返回原始消息。
{ "Name":"Cartoon Studios", "AccountID":"8458jf8757275234", "Social-no":"123-45-6789", "State":"MA" }
结论
本文构建的处理策略为您提供了三种不同的方法来保护在基于REST的体系结构中传输的JSON有效负载。 无论传输协议如何,这都会保留有效负载的私密性。 您学习了如何加密整个有效负载或仅选择元素。 对于给定的用例,您可能只需要使用一种方法。 但是,这为您提供了仅创建方案所需的安全处理的策略或基础。
图40显示了处理策略以及本文中描述的所有规则。
图40.完整的处理策略
翻译自: https://www.ibm.com/developerworks/websphere/library/techarticles/1401_shute/1401_shute.html