2个相等的byte []不返回true

时间:2010-02-26 05:52:19

标签: c# passwords byte

我正在尝试在登录时验证某人的密码。

我输入密码并检索用户保存的哈希密码和密码盐。

然后我用保存的盐哈希输入的密码,看它是否等于保存的密码。

但是,即使byte [] storedPassword与byte [] enteredPassword完全相同,它也不会在bool中返回true,因此不会验证用户。那是为什么?

public static bool VerifyPassword(byte[] newPassword, byte[] storedPassword, byte[] storedSalt)
    {
        byte[] password = CreateHashedPassword(newPassword, storedSalt);

        if (!password.Equals(storedPassword))
            return false;

        return true;
    }

5 个答案:

答案 0 :(得分:13)

你应该比较数组的每个字节,你可以做一个简单的循环,或者使用SequenceEqual Linq Extension方法(如果可用):

public static bool VerifyPassword(byte[] newPassword, byte[] storedPassword,
                                  byte[] storedSalt)
{
    byte[] password = CreateHashedPassword(newPassword, storedSalt);

    return password.SequenceEqual(storedPassword);
}

答案 1 :(得分:3)

Equals不比较两个byte []数组的字节。你必须自己比较两个数组中的每个字节。

答案 2 :(得分:2)

您必须迭代数组的元素以查看它们是否相同。使用.Equals()方法只会告诉您两个变量是否引用相同的数组。

        for (int i = 0; i < password.Length; i++)
            if (password[i] != storedPassword[i])
                return false;
        return true;

答案 3 :(得分:0)

System.Array.Equals方法似乎只测试对象标识,就像object.Equals一样。

你必须编写一个循环并自己比较这些元素。

答案 4 :(得分:0)

Array.Equals就像object.Equals,它测试实例的相等性,而不是“值”相等。

您需要以下内容:

public static boolean ByteArrayEquals(byte[] a, byte[] b) {
  if (a.Length != b.Length)
    return false;
  for (int i = 0; i < a.Length; i++)
  {
      if (a[i] != b[i])
        return false;
  }
  return true;
}