【问题标题】:2 equal byte[] does not return true2 等于 byte[] 不返回 true
【发布时间】:2010-02-26 05:52:18
【问题描述】:

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

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

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

但是,即使 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;
    }

【问题讨论】:

    标签: c# passwords byte


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 在这段代码之前,我会比较密码和存储密码的长度。如果 storedPassword 小于密码,您可以读取数组末尾的内容。另一方面,如果密码较短,则仅比较前几个字节。如果您可以使密码更短,则可能与存储密码的前缀匹配。雅各布
        • 一般来说,密码哈希算法总是产生相同字节数的输出。例如,一个 MD5 哈希总是 16 字节,所以不需要检查哈希的长度。
        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

          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;
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-07-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-11-15
            • 2019-12-07
            相关资源
            最近更新 更多