gpt4 book ai didi

java - SOAP 规范化变换

转载 作者:行者123 更新时间:2023-11-30 08:40:32 25 4
gpt4 key购买 nike

我正在尝试使用托管在 Datapower 设备上的 soap 服务。到目前为止,发送 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>

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

  • 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 客户端库创建)。但是,当我在 Node 中使用 sha1 消化相同的元素时,我得到了不同的摘要值。

我试图在计算摘要值之前发现 java 在转换中做了什么。如果我能弄清楚它实际发送到它的 sha1 方法的是什么,我就可以更正 Node 中的代码来执行相同的操作。

给定上述引用元素,在使用 sha1 散列之前转换之后的输出 xml 是什么?

最佳答案

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

使用 Apache Commons 编解码器 (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()))));
}

}

关于java - SOAP 规范化变换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35606891/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com