![](/img/trans.png)
[英]When calling a method and assigning returned value to an array, why is C# using the array reference when method was called?
[英]Why this byte[] array is different and holds a total different value when it is returned to calling method?
我正在使用.NET反射器来调试调用WSE3.0服务的控制台应用程序,该服务需要使用用户名令牌元素对消息进行签名和加密。 我们的服务提供商使用WSE,因此如果我需要使用非.net客户端,我需要使用它或复制相同的签名和加密逻辑。 要了解实际的消息签名是如何发生的(以便我可以使用NON .NET客户端进行复制),我使用.NET反射器来调试代码。
MessageSignature.BuildSignedInfo调用HMACSHA1SignatureFormatter.Sign,它实际对消息进行签名,并将一个byte []数组的hmac返回给MessageSignature.BuildSignedInfo。 以下是两种方法
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的符号方法中观察窗口
在MessageSignature.BuildSignedInfo中查看返回的byte []数组的窗口(这称为sign方法获取byte []数组)
我正在逐步完成代码,并且没有在它们之间调用的中间方法。 有什么理由会发生这种情况吗?
一些可能性:
也许ComputeHash
没有倒带流,所以QuickWatch窗口的第二次调用会对流的不同部分进行哈希处理? 检查每次通话前后的stream.Position。
如果您正在逐步使用反编译的Microsoft代码,那么该代码可能已经过优化,有时可能会重新排序调用。 当您逐步执行该方法时,可能实际上还没有调用散列函数,或者结果不在您认为的位置。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.