C# 2相等字节[]不返回true

C# 2相等字节[]不返回true,c#,passwords,byte,C#,Passwords,Byte,我试图在登录时验证某人的密码 我获取输入的密码并检索用户保存的哈希密码和密码salt 然后我将输入的密码与保存的salt进行散列,以查看它是否等于保存的密码 但是,即使字节[]存储密码与字节[]输入密码完全相同,它在bool中也不会返回true,因此不会验证用户。为什么呢 public static bool VerifyPassword(byte[] newPassword, byte[] storedPassword, byte[] storedSalt) { byt

我试图在登录时验证某人的密码

我获取输入的密码并检索用户保存的哈希密码和密码salt

然后我将输入的密码与保存的salt进行散列,以查看它是否等于保存的密码

但是,即使字节[]存储密码与字节[]输入密码完全相同,它在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;
    }

Equals不会对两个字节[]数组进行字节比较。您必须自己比较两个数组中的每个字节。

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

        for (int i = 0; i < password.Length; i++)
            if (password[i] != storedPassword[i])
                return false;
        return true;
for(int i=0;i
您应该比较数组的每个字节,您可以创建一个简单的循环,或者使用Linq扩展方法(如果可用):

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

    return password.SequenceEqual(storedPassword);
}

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


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

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;
}
public静态布尔ByteArrayEquals(字节[]a,字节[]b){
如果(a.长度!=b.长度)
返回false;
for(int i=0;i
在此代码之前,我会比较密码和storedPassword的长度。如果storedPassword小于password,则可以从数组末尾读取。另一方面,如果密码较短,则只比较前几个字节。如果可以将密码设置为较短的大小,则可以将其与存储密码的前缀匹配。一般来说,密码散列算法总是产生相同字节数的输出。例如,MD5哈希值始终为16字节,因此无需检查哈希值的长度。