为什么这个byte []数组不同并且在返回到调用方法时保持一个完全不同的值?

时间:2014-07-22 21:52:19

标签: c# arrays bytearray wse

我正在使用.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的签名方法中观察窗口

watch window in sign method of HMACSHA1SignatureFormatter

  

观察返回的byte []数组的窗口   MessageSignature.BuildSignedInfo(这会调用sign方法来获取   byte [] array)

watch window in Buildsignedinfo method

我正在逐步完成代码,并且没有在它们之间调用的中间方法。有什么理由会发生这种情况吗?

1 个答案:

答案 0 :(得分:3)

一些可能性:

  1. 也许ComputeHash没有倒回流,所以QuickWatch窗口的第二次调用会对流的不同部分进行哈希处理?检查每次通话前后的stream.Position。

  2. 如果您正在逐步使用反编译的Microsoft代码,那么该代码可能已经过优化,有时可能会重新排序调用。实际上,当您逐步执行该方法时,哈希函数实际上还没有被调用,或者结果不在您认为的位置。