websphere负载均衡_使用WebSphere DataPower Appliances保护JSON有效负载

在采用轻量级移动设备的推动下,基于REST的通信的采用日益广泛,因此需要保护这些通信。 当消息包含信息有效负载时,尤其如此,通常将其格式化为JavaScript Object Notation(JSON)文本。

本文演示了如何使用运行6.0.1.0版或更高版本固件的WebSphere DataPower设备来加密JSON有效负载,以便使用REST标准进行传输。 这样可以保护与传输方法(例如SSL)无关的消息私密性。 我们将演示以下方法:

  • 整个有效负载使用PKCS#7标准进行加密。
  • 使用共享密钥对选定的元素进行加密。
  • 所选元素使用非对称密钥(证书和密钥)进行加密。

传输的加密(或发送)端和传输的解密(或接收)端均在此进行了说明。

本文还演示了如何使用XQuery和JSONiq处理脚本来执行加密和解密。

您可以在传输的发送和接收端使用相同的多协议网关服务; 静态后端目标只需要调整。

先决条件

本文使用加密密钥和证书。 为了不间断地完成这些说明,您必须首先创建加密密钥和证书对象。

密钥和证书对

请按照以下说明创建必要的密钥和证书对象:

  1. 在导航窗格的搜索栏中键入Ident
  2. 单击“ 加密标识凭证”
  3. 单击“ 添加”创建一个新的“身份凭证”对象。
  4. Name字段中输入Jason ,如图1所示。
  5. 单击加密密钥下的+按钮。 一个新的窗口打开。
  6. 名称字段中输入Jason
  7. 上载加密密钥以完成此对象。 如果没有密钥,请使用设备上可用的加密工具来创建密钥。
  8. 点击应用 。 窗口关闭。
  9. 单击“身份证明”页面上“证书”下的+。 一个新的窗口打开。
  10. 名称字段中输入Jason
  11. 上载加密证书对象以完成此对象。 如果没有密钥,请使用设备上可用的加密工具来创建证书。
  12. 点击应用 。 窗口关闭。
  13. 单击“ 应用”以完成“加密标识凭证”对象。
    图1.密码识别凭证

共享密钥

  1. 在导航窗格的搜索栏中键入Shared
  2. 单击“ 加密共享密钥”
  3. 单击添加以创建新密钥。
  4. Name字段中输入aes-128 ,如图2所示。您必须使用此名称。
  5. 从“ 下载”部分的本文随附的材料中上载keyd.dat文件,或上载您自己的对称密钥。
  6. 点击应用
  7. 点击保存配置
    图2.加密共享密钥
    加密共享密钥

索取文件

这是本文使用的示例JSON文档:

{
  "Name":"Cartoon Studios",
  "AccountID":"8458jf8757275234",
  "Social-no":"123-45-6789",
  "State":"MA"
}

通过执行本文中的步骤,可以确保“ Social-no”元素的值。

创建目的地

本文中创建的服务使用的目的地仅返回服务发送的内容,就像镜像一样。 要创建这样的目的地,请按照下列步骤操作:

  1. 在导航栏的搜索字段中键入HTTP 。 从出现的列表中选择HTTP服务
  2. 单击添加以创建新服务。
  3. 名称字段中输入Mirror
  4. 端口号更改为2049
  5. 模式更改为echo
  6. 点击应用
  7. 点击保存配置

测试配置

完成此处描述的每个处理规则后,您可以通过向网关发送请求来测试新规则。

要测试加密规则,请将纯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),除了“处理策略”。

  1. 在导航窗格上的搜索栏中键入Multi
  2. 从可能的条目列表中选择New MultiProtocol Gateway
  3. 输入或选择以下值:
    • 名称: SecureJSON
    • 预设后端网址: http://127.0.0.1:2049 http://127.0.0.1:2049 http://127.0.0.1:2049
    • 响应类型:直通
    • 请求类型:非XML
    图3.多协议网关初始配置
    多协议网关初始配置
  4. 在多协议网关的“ 高级”选项卡上(图4),将Proxy HTTP Response设置为On 。 返回到“ 常规”选项卡。
    图4.“多协议网关高级”选项卡
    多协议网关高级选项卡

前端协议处理程序

  1. 在“ 前端协议”下 ,单击“ +”创建一个新的处理程序。 从出现的列表中选择HTTP前端处理程序 。 在打开的“ 配置HTTP前端处理程序”窗口中,设置以下值(图5):
    • 名称: HTTP3333
    • 端口号: 3333
    • 允许的方法:单击以将GET方法添加到默认列表。
    图5.前端协议处理程序
    前端协议处理程序

完成临时配置

  1. 在“ 多协议网关策略”下 ,选择“ 默认” 。 该策略只是网关完成时使用的占位符。
  2. 单击“ 应用”以应用新网关的设置。
  3. 点击保存配置

处理策略配置

此处详细介绍了将加密应用于JSON有效负载的三种方法。 您可能只想执行与要使用的方法有关的那些步骤。

请注意,网关配置使用非XML请求类型来允许PKCS#7解密规则成功运行。 如果您不打算使用此规则,则可以将网关配置请求类型设置JSON 。 这会使设备自动检查请求文档,以确保文档格式正确。 这对于探针也更有效。

PKCS#7加密

  1. 在“ 多协议网关策略”下 ,单击+创建新策略。
  2. 输入SecureJSON作为策略的名称 ,如图6所示。
  3. 点击新建规则
  4. 将规则的名称更改为SecureJSON_rule_pk7encrypt
  5. 将“ 规则方向”设置为 客户端到服务器”
  6. 双击突出显示的“ 匹配操作”图标。
    图6.初始处理策略
    初步处理政策
  7. 单击+创建一个新的匹配。
  8. Name字段中输入ebin ,如图7所示。
  9. 单击匹配规则选项卡。
  10. 点击添加
  11. 在URL匹配字段中输入*/ebin
  12. 点击应用 。 窗口关闭。 新规则输入到网格中。
    图7. ebin匹配规则
    ebin匹配规则
  13. 点击应用 。 窗口关闭。
  14. 单击完成 。 窗口关闭。 蓝色的“处理策略”窗格再次处于活动状态(图8)。
    图8.匹配动作
    比赛动作
  15. 高级操作图标拖动到处理行上。
  16. 双击图标。
  17. 从可能的操作类型列表中选择Crypto Binary ,如图9所示。
    图9.选择加密二进制高级操作
    选择“加密二进制高级操作”
  18. 单击下一步 。 一个新的窗口打开。
  19. 从可能的操作列表中选择PKCS#7 Encrypt ,如图10所示。
  20. 从“ 收件人 ”列表中选择所需的证书,然后单击“ 添加”
    图10. PKCS#7加密
    PKCS#7加密
  21. 单击完成 。 窗口关闭。
    图11. PKCS#7加密策略
    KCS#7加密策略
  22. 单击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解密

  1. 点击新建规则
  2. 将规则的名称更改为SecureJSON_rule_pk7decrypt
  3. 将“ 规则方向”设置为 客户端到服务器”
  4. 双击突出显示的“ 匹配操作”图标。
  5. 单击+创建一个新的匹配。
  6. 在Name字段中输入dbin ,如图12所示。
  7. 单击匹配规则选项卡。
  8. 点击添加
  9. URL匹配字段中输入 */dbin
  10. 点击应用 。 窗口关闭。 新规则输入到网格中。
    图12. dbin匹配规则
    dbin匹配规则
  11. 点击应用 。 窗口关闭。
  12. 单击完成 。 窗口关闭。 蓝色的“处理策略”窗格再次处于活动状态。
  13. 高级操作图标拖动到处理行上。
  14. 双击图标。
  15. 从可能的操作类型列表中选择“ 加密二进制 ”。
  16. 单击下一步 。 一个新的窗口打开。
  17. 从可能的操作列表中选择PKCS#7 Decrypt ,如图13所示。
  18. 从“ 输入编码格式 ”列表中选择PEM
  19. 从“ 输出编码格式 ”列表中选择“ ”。
  20. 收件人列表中选择所需的加密标识凭据,然后单击添加
    图13. PKCS#7解密
    PKCS#7解密
  21. 单击完成 。 窗口关闭。
  22. 单击“ 应用策略” 。 如果这完成了所需的策略配置,请单击“ 关闭窗口”以关闭“处理策略”窗口。 然后在“网关”页面上单击“ 应用 ”。

    如果提交上面构造的用于加密JSON有效负载的规则的结果,则应该再次收到原始的纯文本JSON文档。

    {
              "Name":"Cartoon Studios",
              "AccountID":"8458jf8757275234",
              "Social-no":"123-45-6789",
              "State":"MA"
    }

使用共享密钥进行元素加密

您必须创建一个共享密钥加密对象才能使用此方法。 如果尚未创建共享密钥,请按照“ 共享密钥”部分中的说明进行操作。

请按照以下步骤使用共享密钥来加密JSON有效内容的元素:

  1. 单击新规则。
  2. 将规则名称更改为SecureJSON_rule_ssencrypt.
  3. 将“ 规则方向”设置为 客户端到服务器”
  4. 双击突出显示的“ 匹配操作”图标。
  5. 点击+创建新的匹配
  6. 名称字段中输入ssn
  7. 单击匹配规则选项卡。
  8. 点击添加
  9. URL匹配字段中输入 */ssn
  10. 点击应用 。 窗口关闭。 新规则输入到网格中,如图14所示。
    图14. ssn匹配规则
    ssn匹配规则
  11. 点击应用 。 窗口关闭。
  12. 单击完成 。 窗口关闭。 蓝色的“处理策略”窗格再次处于活动状态。
  13. 将“ 变换”图标拖到处理行上。
  14. 双击图标。
  15. 在“ 使用文档处理说明”下 ,选择“使用处理控制文件转换”(如果指定)
  16. 输入语言应为JSON转换语言应为Xquery
  17. 单击Processing Control文件下的Upload按钮,然后上载set-dp-var.xq文件,如图15所示。
    图15.配置Xquery转换
    配置Xquery转换
  18. 单击完成 。 窗口关闭。 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变量的设置。 在处理策略的下一步中使用此变量。

  19. 将另一个变换动作拖到“处理规则上。
  20. 双击图标。
  21. 在“ 使用文档处理说明”下 ,选择“使用XSLT样式表转换” ,如图17所示。
  22. 上载string-crypto-var.xsl文件。
  23. 输出上下文设置为NULL
    图17.配置Transform XSLT
    配置Transform XSLT
  24. 单击完成 。 窗口关闭。

    此样式表检索上一步中设置的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>

    再一次,此转换的输出并不重要。 变量值的设置很重要。

  25. 最后将“ 变换”动作拖到“处理规则”上。
  26. 双击图标。
  27. 在“ 使用文档处理说明”下 ,选择“使用处理控制文件转换”(如果已指定 ,如图18所示)。
  28. 输入语言应为JSON转换语言应为Xquery
  29. 单击“ 处理控制文件”下的“上载”按钮,然后上载use-dp-var.xq文件。
  30. 输入设置为INPUT
  31. 输出设置为OUTPUT
  32. 单击完成 。 窗口关闭。
    图18.使用XQuery进行转换
    使用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 }
    )

    该脚本输出原始消息,用加密的字段值代替原始值。

  33. 单击“ 应用策略” 。 如果这完成了所需的策略配置,请单击“ 关闭窗口”以关闭“处理策略”窗口。 然后在“网关”页面上单击“ 应用 ”。

    如果您通过此规则提交样本文档进行加密,则响应类似于以下内容:

    {
      "State":"MA",
      "AccountID":"8458jf8757275234",
      "Social-no":"RynTyS5R0hTDDT7e/3OfK0ItyC4rCxZQr8a3D2yITck=",
      "Name":"Cartoon Studios"
    }

使用共享密钥进行元素解密

请按照以下步骤使用共享密钥来解密JSON有效负载的元素:

  1. 点击新建规则
  2. 将规则的名称更改为SecureJSON_rule_ssdecrypt
  3. 将“ 规则方向”设置为 客户端到服务器”
  4. 双击突出显示的“匹配操作”图标。
  5. 单击+创建一个新的匹配。
  6. 在Name字段中输入dssn ,如图19所示。
  7. 单击匹配规则选项卡。
  8. 点击添加
  9. 在URL Match字段中输入*/dssn
  10. 点击应用 。 窗口关闭。 新规则输入到网格中。
    图19.配置匹配规则
    配置匹配规则
  11. 点击应用 。 窗口关闭。
  12. 单击完成 。 窗口关闭。 蓝色的“处理策略”窗格再次处于活动状态。
  13. 将“ 变换”图标拖到处理行上。
  14. 双击图标。
  15. 在“ 使用文档处理说明”下 ,选择“使用处理控制文件转换”(如果已指定 ,如图20所示)。
  16. 输入语言应为JSON转换语言应为Xquery
  17. 在“ 处理控制文件”下 ,选择set-dp-var.xq文件。
    图20.使用XQuery进行转换
    使用XQuery进行转换
  18. 单击完成 。 窗口关闭。 图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变量的设置。 在处理策略的下一步中使用此变量。

  19. 将另一个变换动作拖到“处理规则上。
  20. 双击图标。
  21. 在“ 使用文档处理说明”下 ,选择“使用XSLT样式表转换” ,如图22所示。
  22. 上载string-crypto-var-dec.xsl文件。
  23. 输出上下文字段中输入 NULL
    图22.配置XSLT转换
    配置XSLT转换
  24. 单击完成 。 窗口关闭。

    此样式表检索上一步中设置的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>

    再一次,此转换的输出并不重要。 变量值的设置很重要。

  25. 最后将“ 变换”动作拖到“处理规则”上。
  26. 双击图标。
  27. 在“ 使用文档处理说明”下 ,选择“使用处理控制文件转换”(如果指定的话) ,如图23所示。
  28. 输入语言应为JSON转换语言应为Xquery
  29. 在“ 处理控制文件”下 ,选择use-dp-var.xq文件。
  30. 输入设置为INPUT
  31. 输出设置为OUTPUT
    图23.配置XQuery转换
    配置XQuery转换
  32. 单击完成 。 窗口关闭。

    这是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.完成的解密策略
    完整的解密政策
  33. 单击“ 应用策略” 。 如果这完成了所需的策略配置,请单击“ 关闭窗口”以关闭“处理策略”窗口。 然后在“网关”页面上单击“ 应用 ”。

    如果您提交使用共享密钥加密的有效负载,则将返回原始JSON文档。

    {
      "Name":"Cartoon Studios",
      "AccountID":"8458jf8757275234",
      "Social-no":"123-45-6789",
      "State":"MA"
    }

使用非对称密钥进行元素加密

此方法需要使用加密密钥和证书。 如果尚未创建密钥对象,请按照“ 密钥和证书对”部分中的说明进行操作。

  1. 点击新建规则
  2. 将规则的名称更改为SecureJSON_rule_asencrypt
  3. 将“ 规则方向”设置为 客户端到服务器”
  4. 双击突出显示的“ 匹配操作”图标。
  5. 单击+创建一个新的匹配。
  6. 名称字段中输入ssna
  7. 单击匹配规则选项卡。
  8. 点击添加
  9. 在“ URL匹配”字段中输入 */ssna
  10. 点击应用 。 窗口关闭。 新规则将输入到网格中,如图25所示。
    图25.配置匹配规则
    配置匹配规则
  11. 点击应用 。 窗口关闭。
  12. 单击完成 。 窗口关闭。 蓝色的“处理策略”窗格再次处于活动状态。
  13. 最后将“ 变换”动作拖到“处理规则”上。
  14. 双击图标。
  15. 在“ 使用文档处理说明”下 ,选择“使用处理控制文件转换”(如果指定)
  16. 输入语言应为JSON转换语言应为Xquery
  17. 单击“ 处理控制文件”下的“上载”按钮,然后上载extract-ssn-output.xq文件。
  18. 单击完成 。 窗口关闭。

    这是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.处理策略
    处理政策
  19. Encrypt图标(图26)拖到处理行上。
  20. 双击图标。 一个新的窗口打开。
  21. 信封方法设置为标准XML加密
  22. 消息类型设置为Raw XML Document
  23. 使用收件人证书Jason ,如图27所示。
    图27.配置加密操作
    配置加密Actio
  24. 单击完成
    图28.处理策略
    加工政策

    为了在JSON消息中通过网络传输加密的值,必须对加密的数据块进行URL编码。 下一个动作将执行此任务。

  25. 将“ 变换动作” (图28)拖到“处理规则”上。
  26. 双击图标。
  27. 在“ 使用文档处理说明”下 ,选择“使用XSLT样式表转换” ,如图29所示。
  28. 上载urlencode.xsl文件。
  29. 输出设置为NULL
    图29.配置XSLT转换
    配置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>
  30. 最后将“ 变换”动作拖到“处理规则”上。
  31. 双击图标。
  32. 在“ 使用文档处理说明”下 ,选择“使用处理控制文件转换”(如果指定)
  33. 输入语言应为JSON转换语言应为Xquery
  34. 点击上传下的处理控制文件,并上传使用加密-var.xq文件。
  35. Input上下文设置为INPUT ,如图30所示。
  36. 输出上下文设置为OUTPUT
    图30.配置最终的XQuery转换
    配置最终的XQuery转换
  37. 单击完成 。 窗口关闭。 图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元素。

  38. 单击“ 应用策略” 。 如果这完成了所需的策略配置,请单击“ 关闭窗口”以关闭“处理策略”窗口。 然后在“网关”页面上单击“ 应用 ”。

    如果使用此规则将示例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"
    }

使用非对称密钥进行元素解密

  1. 点击新建规则
  2. 将规则的名称更改为SecureJSON_rule_asdecrypt
  3. 将“ 规则方向”设置为 客户端到服务器”
  4. 双击突出显示的“ 匹配操作”图标。
  5. 单击+创建一个新的Match
  6. 名称字段中输入assn
  7. 单击匹配规则选项卡。
  8. 点击添加
  9. URL匹配字段中输入 */assn
  10. 点击应用 。 窗口关闭。 新规则将输入到网格中,如图32所示。
    图32.配置匹配规则
    配置匹配规则
  11. 点击应用 。 窗口关闭。
  12. 单击完成 。 窗口关闭。 蓝色的“处理策略”窗格再次处于活动状态。
  13. 最后将“ 变换”动作拖到“处理规则”上。
  14. 双击图标。
  15. 在“ 使用文档处理说明”下 ,选择“使用处理控制文件转换”(如果指定的话) ,如图33所示。
  16. 输入语言应为JSON转换语言应为Xquery
  17. 单击“ 处理控制文件”下的“上载”按钮,然后上载set-dpvar-encrypted.xq文件。
    图33.配置XQuery转换
    配置XQuery转换
  18. 单击完成 。 窗口关闭。 到目前为止,图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>

    在这种情况下,输出并不重要; 设置变量很重要。 下一个动作将使用它。

  19. 将“ 变换”动作拖到“处理规则”上。
  20. 双击图标。
  21. 在“ 使用文档处理说明”下 ,选择“使用XSLT样式表转换” ,如图35所示。
  22. 上载urldecode-var.xsl文件。
  23. 在“ 输出上下文”字段中输入 posted的类型。
    图35.配置XSLT转换
    配置XSLT转换
  24. 单击完成 。 窗口关闭。

    此样式表的输出很重要。 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>
  25. 解密图标拖到处理行上。
  26. 双击图标。 一个新的窗口打开。
  27. 从可能的Input上下文中选择发布 ,如图36所示。
  28. 消息类型设置为整个文档
  29. 使用解密密钥 Jason
  30. 输出上下文字段中输入 outdata
    图36.配置解密操作
    配置解密操作
  31. 单击完成

    解密后的数据现在位于outdata上下文中。 下一步操作将使用此输入,并将数据放在DataPower变量中,以备后用。

  32. 将“ 变换”动作拖到“处理规则”上。
  33. 双击图标。
  34. 从可能的Input上下文列表中选择outdata ,如图37所示。
  35. 在“ 使用文档处理说明”下 ,选择“使用XSLT样式表转换”
  36. 上载make-decoded-var.xsl文件。
  37. 输出上下文中输入relegate
    图37.配置XSLT转换
    配置XSLT转换
  38. 单击完成 。 窗口关闭。 图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>
  39. 最后将“ 变换”动作拖到“处理规则”上。
  40. 双击图标。
  41. 从可能的Input上下文列表中选择INPUT ,如图39所示。
  42. 在“ 使用文档处理说明”下 ,选择“使用处理控制文件转换”(如果指定)
  43. 输入语言应为JSON转换语言应为Xquery
  44. 单击“ 处理控制文件”下的“上载”按钮,然后上载use-decoded-var.xq文件。
  45. 从可能的输出上下文列表中选择输出
    图39.配置XQuery转换
    配置XQuery转换
  46. 单击完成 。 窗口关闭。
  47. 单击“ 应用策略” 。 如果这完成了所需的策略配置,请单击“ 关闭窗口”以关闭“处理策略”窗口。 然后在“网关”页面上单击“ 应用 ”。

    这是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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值