c# – ComputeHash调用莫名其妙地不同

为什么以下两种调用ComputeHash的方法导致不同的结果长度?似乎代码应该产生相同的结果.

byte[] KeyBytes = Convert.FromBase64String("KgMLuq+k1oCUv5bzTlKAJf/mGo0T07jTogbi6apcqLa114CCPH3rlK4c0RktY30xLEQ49MZ+C2bMyFOVQO4PyA==");
byte[] MessageBytes = System.Text.Encoding.UTF8.GetBytes("ae06fcd3-6447-4356-afaa-813aa4f2ba41;70aa7c25-c74f-48be-8ca8-cbf73627c05f1418068667");

// works
byte[] HashBytes1 = new System.Security.Cryptography.HMACSHA256(KeyBytes).ComputeHash(MessageBytes); // correct - 32 bytes

// doesn't work
System.Security.Cryptography.HMAC hmac2 = System.Security.Cryptography.HMACSHA256.Create();
hmac2.Key = KeyBytes;
byte[] HashBytes2 = hmac2.ComputeHash(MessageBytes); // wrong - only 20 bytes

最佳答案 这很简单:看一下静态
HMAC.Create方法的评论:

By default, this overload uses the SHA-1 implementation of HMAC. If you want to specify a different implementation, use the Create(String) overload, which lets you specify an algorithm name, instead.

现在HMACSHA256继承自HMAC,但它没有定义它自己的静态Create方法.所以你仍然需要使用HMAC.Create("HMACSHA256").

使用HMAC.Create(String)可能比使用HMACSHA256.Create(String)类更好,因为不要混淆问题.

注意,SHA-1输出160位或20字节,所以这确实解释了奇数输出大小……

点赞