Sha512在c#哈希验证中不返回相等

时间:2016-03-24 20:24:21

标签: c#

64个字节相同,但==返回false。我猜测编码可能有问题,但我无法弄清楚我做错了什么。有什么想法来解决这个问题吗?

float

我用一个简单的值来测试它,因为它们都调用相同的哈希方法,所以除了编码中的某些东西之外,我看不出它是如何失败的。我只是使用内置的System.Security.Cryptography。

2 个答案:

答案 0 :(得分:6)

在C#中,如果两个数组相同,则它们仅等于另一个数组,即它们是完全相同的数组。正常的相等比较不会检查这些数组的内容是否相等:

byte[] x = new byte[] { 1, 2, 3 };
byte[] y = new byte[] { 1, 2, 3 };

Console.WriteLine(x == y); // false

您可以使用Enumerable.SequenceEqual检查内容是否相同:

Console.WriteLine(x.SequenceEqual(y)); // true

由于SHA512哈希值通常以十六进制显示,因此实际返回十六进制字符串而不是字节数组可能是有意义的。您可以使用其中一个many ways to convert a byte array into a hex string。然后,您可以对字符串执行相等检查 - 这将按预期工作。

答案 1 :(得分:4)

不,编码没有问题 - byte[]中没有编码。他们只是字节。对于执行参考比较的数组,==只是一个问题。

您可以使用SequenceEqual来比较数组:

public static bool Validate(string enteredValue, byte[] hashedValue)
{
    // TODO: Rename `hashSHA512 to follow .NET naming conventions
    byte[] hash = hashSHA512 (enteredValue);
    return hash.SequenceEqual(hashedValue);
}

请注意,您的using指令中需要using System.Linq;来引入LINQ。

备选方案:

  • 将两者转换为base64(文本)表示并比较
  • 编写自己的数组相等检查器,这可能比SequenceEqual
  • 更有效