- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我在使用 WS-Security 和创建正确的随机数和密码摘要时遇到问题。
我成功地使用 SoapUI 将数据发送到 Oracle 系统。所以我能够拦截 SoapUI 的调用(将代理更改为 127.0.0.1 端口 8888 以在失败时使用 Fiddler,因为它通过 SSL)- 拦截很重要,因为这些值只能使用一次。然后,我可以获取随机数、创建的时间戳和密码摘要,将它们放入我的代码中(我只有 30 秒的时间来执行此操作,因为这些值不会持久!),我获得了成功。
所以我知道这不是别的 - 只是密码摘要。
我使用的值如下:
Nonce: UIYifr1SPoNlrmmKGSVOug==
Created Timestamp: 2009-12-03T16:14:49Z
Password: test8
Required Password Digest: yf2yatQzoaNaC8BflCMatVch/B8=
我知道创建摘要的算法是:
Password_Digest = Base64 ( SHA-1 ( nonce + created + password ) )
使用以下代码(来自 Rick Strahl's post)
protected string GetSHA1String(string phrase)
{
SHA1CryptoServiceProvider sha1Hasher = new SHA1CryptoServiceProvider();
byte[] hashedDataBytes = sha1Hasher.ComputeHash(Encoding.UTF8.GetBytes(phrase));
return Convert.ToBase64String(hashedDataBytes);
}
我得到:
GetSHA1String("UIYifr1SPoNlrmmKGSVOug==" + "2009-12-03T16:14:49Z" + "test8") = "YoQKI3ERlMDGEXHlztIelsgL50M="
我尝试了各种 SHA1 方法,所有方法都返回相同的结果(我想这是件好事!):
SHA1 sha1 = SHA1.Create();
SHA1 sha1 = SHA1Managed.Create();
// Bouncy Castle:
protected string GetSHA1usingBouncyCastle(string phrase)
{
IDigest digest = new Sha1Digest();
byte[] resBuf = new byte[digest.GetDigestSize()];
byte[] bytes = Encoding.UTF8.GetBytes(phrase);
digest.BlockUpdate(bytes, 0, bytes.Length);
digest.DoFinal(resBuf, 0);
return Convert.ToBase64String(resBuf);
}
关于如何获得正确哈希的任何想法?
最佳答案
问题是随机数。
我试图使用已经过 Base64 编码的随机数。如果您想使用形式为“UIYifr1SPoNlrmmKGSVOug==”的 Nonce,那么您需要对其进行解码。
Convert.FromBase64String("UIYifr1SPoNlrmmKGSVOug==")
这是一个字节数组。
所以我们需要一个新的方法:
public string CreatePasswordDigest(byte[] nonce, string createdTime, string password)
{
// combine three byte arrays into one
byte[] time = Encoding.UTF8.GetBytes(createdTime);
byte[] pwd = Encoding.UTF8.GetBytes(password);
byte[] operand = new byte[nonce.Length + time.Length + pwd.Length];
Array.Copy(nonce, operand, nonce.Length);
Array.Copy(time, 0, operand, nonce.Length, time.Length);
Array.Copy(pwd, 0, operand, nonce.Length + time.Length, pwd.Length);
// create the hash
var sha1Hasher = new SHA1CryptoServiceProvider();
byte[] hashedDataBytes = sha1Hasher.ComputeHash(operand);
return Convert.ToBase64String(hashedDataBytes);
}
CreatePasswordDigest(Convert.FromBase64String("UIYifr1SPoNlrmmKGSVOug=="), "2009-12-03T16:14:49Z", "test8")
它返回我们想要的 yf2yatQzoaNaC8BflCMatVch/B8=。
请记住在摘要中使用与您在 XML 中输入的相同的 createdTime,这听起来很明显,但有些人在他们的时间戳中包含毫秒,而有些则没有 - 没关系,它只需要保持一致.
此外,UsernameToken XML 中的 Id 字段也无关紧要 - 它不需要更改。
如果您不想像 Rick 使用的那样使用 GUID,这里有一种创建 Nonce 的方法:
private byte[] CreateNonce()
{
var Rand = new RNGCryptoServiceProvider();
//make random octets
byte[] buf = new byte[0x10];
Rand.GetBytes(buf);
return buf;
}
我希望这对某人有所帮助 - 我经历了很多挫折、反复试验、搜索网页和一般的头部/墙壁撞击。
关于c# - WS-Security 中 PasswordDigest 的工作算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19438000/
我有一个使用 spring-ws 的 web 服务(服务器端)的实现。我想更改我的代码以使用 spring-integration-ws(ws:入站网关和 channel )。我已经尝试过示例,但仍然
我正在尝试使用 JAX-WS (Metro) 开发一个独立的 Java Web 服务客户端,它使用 WS-Security 和用户名 token 身份验证(密码摘要、随机数和时间戳)和时间戳验证以及
我开始使用 JAX WS 研究 Java Web 服务。我正在阅读的书的第一章展示了如何仅使用 java SE 构建和部署简单的 jax ws web 服务。特别是,Web 服务是通过 Endpoin
我尝试在 Netbean 6.8 中使用 ws-import 生成 Java 类。我想重新生成 jax-ws,因为在 ebay.api.paypalapi 包中发现了一个错误(我认为该错误是由于 Pa
我正在为我的项目编写服务器端,它需要 websockets 提供的功能。我一直在寻找并在 npm 中找到了 3 个库。 ws、websocket 和express-ws。您能否解释一下它们之间的区别并
我有一个用于测试 Web 服务的项目,它使用 spring-ws 库。spring-ws 在不久的将来会支持 WS-Reliable Messaging 吗? 最佳答案 作为 Spring-WS 的领
我在 Tomcat 上部署了一个有状态的 Web 服务。它由工厂服务和主要 API 服务组成,并且运行良好。工厂服务向主 API 实例返回一个 W3CEndpointReference,客户端使用该
我构建了一个最小的 Web 服务并使用 javax.xml.ws.Endpoint 发布它。如果我尝试在http://localhost:1234/AddService?wsdl 工作正常。 尝试在
我正在实现一个必须支持 WS-Trust (1.3) 的网络服务。 OASIS 将 WS-Trust 的命名空间定义为 http://docs.oasis-open.org/ws-sx/ws-trus
有没有办法操纵jaxws中使用的编码器。 我喜欢发送一个在网络服务请求中提交的 cdata,为此我想在这里尝试类似描述的东西:http://odedpeer.blogspot.de/2010/07/j
我正在尝试使用 Spring-WS 构建一个简单的 Web 服务客户端,但遇到了麻烦。我试图调用的 SOAP 服务使用 HTTP 基本身份验证以确保安全。 使用 Spring-WS 教程示例,我已经配
我对网络服务很陌生。我找不到 JAX-WS 和 CXF 之间的区别。 据我了解,JAX-WS是java提供的规范,CXF是实现。 如果我错了,请纠正我。 最佳答案 是的,你是对的。 JAX-WS 是基
我有很多用 @WebService(targetNamespace = "mynamespace") 注释的端点.每@WebResult和 @WebParam与 targetNamespace = "
根据网上的文献,我可以看到有两个与Web Services Eventing相关的规范: WS-BaseNotification - 由 OASIS 于 2004 年提交 WS-Eventing -
对于基于 SOAP 的 Web 服务,为什么应该选择 Spring WS 而不是 JAX-WS。我已经阅读了一些文章,甚至 Spring WS 文档功能,但我仍然不清楚。如果我需要说服某人使用 Spr
我使用 wsimport 创建了一个肥皂客户端,我需要将消息中字符串字段内的 xml 数据发送到网络服务器。我知道我实际上并不需要在 Web 服务调用中使用 cdata,但 Web 服务需要此字段位于
我想问一下如何在 JAX-WS 中指定 SOAP Web 服务,这样如果我希望通过值 A 或值B。任何其他值都应该返回错误。 我想到了Java中的枚举,但仍然不知道如何实现它。 有什么建议吗?预先感谢
我用 pyws 实现了一个简单的 Web 服务服务器和 suds . from pyws.server import SoapServer from pyws.functions.register i
我正在 javascript 中使用 websockets 连接到 API 并读取一些数据。 这是代码: function processHUOBIAPI(client,exchange_name,e
我正在使用 Node.js + Express + Express-ws 创建应用程序,但在连接后尝试发送消息时出现以下错误: const fs = require('fs'); con
我是一名优秀的程序员,十分优秀!