我正在使用.NET反射器调试一个调用WSE3.0服务的控制台应用程序,该服务需要签名&使用用户名令牌元素加密消息。我们的服务提供商使用WSE,因此如果我需要使用非.net客户端,我需要使用它或复制相同的签名和加密逻辑。 要了解实际的消息签名是如何发生的(以便我可以使用NON .NET客户端进行复制),我使用.NET反射器来调试代码。
MessageSignature.BuildSignedInfo调用HMACSHA1SignatureFormatter.Sign,它实际对消息进行签名,并将一个byte []数组的hmac返回给MessageSignature.BuildSignedInfo。 以下是2种方法
private byte[] BuildSignedInfo(SignatureFormatter formatter)
{
this.SignedInfo.SignatureMethod = formatter.AlgorithmURI;
return formatter.Sign(this.CanonicalizeSignedInfo());
}
public override byte[] Sign(Stream data)
{
HMACSHA1 hmacsha = new HMACSHA1(this._key);
return hmacsha.ComputeHash(data);
}
这是监视窗口中字节数组的样子。
在HMACSHA1SignatureFormatter的签名方法中观察窗口
观察返回的byte []数组的窗口 MessageSignature.BuildSignedInfo(这会调用sign方法来获取 byte [] array)
我正在逐步完成代码,并且没有在它们之间调用的中间方法。有什么理由会发生这种情况吗?
答案 0 :(得分:3)
一些可能性:
也许ComputeHash
没有倒回流,所以QuickWatch窗口的第二次调用会对流的不同部分进行哈希处理?检查每次通话前后的stream.Position。
如果您正在逐步使用反编译的Microsoft代码,那么该代码可能已经过优化,有时可能会重新排序调用。实际上,当您逐步执行该方法时,哈希函数实际上还没有被调用,或者结果不在您认为的位置。