ComputeHash 调用莫名其妙地不同
ComputeHash Calls Inexplicably Differ
为什么下面两种调用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
很简单:看staticHMAC.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)
class 更好,以免混淆。
请注意 SHA-1 输出 160 位或 20 字节,所以这确实解释了奇数输出大小...
来自 MSDN:System.Security.Cryptography.HMACSHA256.Create()
默认情况下,此重载使用 HMAC 的 SHA-1 实现。如果您想指定不同的实现,请使用 Create(String) 重载,它可以让您指定一个算法名称。
当前调用 Create 时实际上是在调用基础 class' Create 函数。
尝试:
System.Security.Cryptography.HMAC hmac2 = System.Security.Cryptography.HMACSHA256.Create("System.Security.Cryptography.HMACSHA256");
是的,我意识到这在代码形式中看起来多么愚蠢...只是想回答这个问题。
替代方案:
System.Security.Cryptography.HMAC hmac2 = System.Security.Cryptography.HMAC.Create("System.Security.Cryptography.HMACSHA256");
为什么下面两种调用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
很简单:看staticHMAC.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)
class 更好,以免混淆。
请注意 SHA-1 输出 160 位或 20 字节,所以这确实解释了奇数输出大小...
来自 MSDN:System.Security.Cryptography.HMACSHA256.Create()
默认情况下,此重载使用 HMAC 的 SHA-1 实现。如果您想指定不同的实现,请使用 Create(String) 重载,它可以让您指定一个算法名称。
当前调用 Create 时实际上是在调用基础 class' Create 函数。
尝试:
System.Security.Cryptography.HMAC hmac2 = System.Security.Cryptography.HMACSHA256.Create("System.Security.Cryptography.HMACSHA256");
是的,我意识到这在代码形式中看起来多么愚蠢...只是想回答这个问题。
替代方案:
System.Security.Cryptography.HMAC hmac2 = System.Security.Cryptography.HMAC.Create("System.Security.Cryptography.HMACSHA256");