2010-02-26 58 views
7

我试图登录时,验证别人的密码。等于2字节[]没有返回true

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

然后我用已保存的盐对输入的密码进行哈希以查看它是否与保存的密码相同。

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

回答

3

等于不比较两个byte []数组的字节数。您必须自己比较两个阵列中的每个字节。

2

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

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

此代码之前,我会比较密码和storedPassword的长度。如果storedPassword小于密码,则可以读取数组的末尾。另一方面,如果密码较短,则仅比较前几个字节。如果您可以将密码设置为较短的尺寸,则可以使用存储的密码的前缀进行匹配。 Jacob – TheJacobTaylor 2010-02-26 06:05:34

+0

一般来说,密码哈希算法总是产生相同数量的字节。例如,MD5散列总是16个字节,所以不需要检查散列的长度。 – Gabe 2010-02-26 06:10:03

13

你应该比较您的阵列的每个字节,你可以做一个简单的循环,或使用LINQ的SequenceEqual扩展方法(如果可用):

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

    return password.SequenceEqual(storedPassword); 
} 
0

的System.Array.Equals方法看起来测试仅用于对象标识,就像object.Equals一样。

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

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