肥皂规范化变换

Posted

技术标签:

【中文标题】肥皂规范化变换【英文标题】:Soap Canonicalization Transform 【发布时间】:2016-06-07 00:32:32 【问题描述】:

我正在尝试使用托管在 Datapower 设备上的肥皂服务。到目前为止,发送soap服务和接收者对以下xml的摘要计算不同。

用于创建摘要值的转换

<ds:Reference URI="#TS-f3c103e9-1897-43d8-8cf6-274bdb647678">
    <ds:Transforms>
       <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
          <ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="wsse soap"/>
       </ds:Transform>
   </ds:Transforms>
   <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
   <ds:DigestValue>1rjXQQWVMM5KBWY8uswUynk6PCk=</ds:DigestValue>
</ds:Reference>

被引用的元素。

<wsu:Timestamp wsu:Id="TS-f3c103e9-1897-43d8-8cf6-274bdb647678">
  <wsu:Created>2016-02-24T15:32:12.693Z</wsu:Created>
  <wsu:Expires>2016-02-24T15:37:12.693Z</wsu:Expires>
</wsu:Timestamp>

上述元素的命名空间应用于根节点

xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:ds="http://www.w3.org/2000/09/xmldsig#"

发送上述 XML 可以正常工作(从 Java soap 客户端库创建)。但是,当我在节点中使用 sha1 消化相同的元素时,会得到不同的消化值。

我试图在计算摘要值之前发现 java 在转换中做了什么。如果我能弄清楚它实际发送给它的 sha1 方法的内容,我可以更正 node 中的代码来做同样的事情。

鉴于上述参考元素,在使用 sha1 散列之前转换后的输出 xml 是什么?

【问题讨论】:

【参考方案1】:

您需要弄清楚您的 java 库或 API 如何创建发送到 SHA1 方法的规范化 XML。

使用 Apache Commons Codec (https://commons.apache.org/proper/commons-codec/) 并从 Timestamp 元素和 Transform 元素中包含的命名空间猜测 C14N'd XML,我能够得到相同的摘要值:1rjXQQWVMM5KBWY8uswUynk6PCk=

这是我使用的代码:

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.digest.DigestUtils;

public class Sha1Test 

    public static void main(String args[]) throws Exception 
        String data = "<wsu:Timestamp xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:wsse=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\" xmlns:wsu=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd\" wsu:Id=\"TS-f3c103e9-1897-43d8-8cf6-274bdb647678\"><wsu:Created>2016-02-24T15:32:12.693Z</wsu:Created><wsu:Expires>2016-02-24T15:37:12.693Z</wsu:Expires></wsu:Timestamp>";
        printShaDigest(data);
    

    static void printShaDigest(String data) 
        System.out.println("data = " + data);
        System.out.println("sha1 = " + new String(Base64.encodeBase64(DigestUtils.sha1(data.getBytes()))));
    


【讨论】:

以上是关于肥皂规范化变换的主要内容,如果未能解决你的问题,请参考以下文章

数据变换-归一化与标准化

【数据分析】-005-数据预处理-数据变换

数据变换

在 OpenCV C++ 中为 OCR 规范化车牌

如何使用变换高阶函数?

R中,数据标准化方法