2 равных байта [] не возвращают true

Я пытаюсь проверить чей-то пароль при входе в систему.

Я беру введенный пароль и получаю сохраненную хешированную соль пароля и пароля пользователей.

Затем я хеширую введенный пароль с сохраненной солью, чтобы видеть, равно ли это сохраненному паролю.

Однако даже при том, что байт [] storedPassword точно похож на байт [] enteredPassword, он не возвращает true в bool и поэтому не проверяет пользователя. Почему это?

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

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

        return true;
    }
7
задан Jova 26 February 2010 в 05:52
поделиться

5 ответов

Вы должны перебирать элементы массива, чтобы увидеть, совпадают ли они. Использование метода .Equals () сообщает вам, только если две переменные ссылаются на один и тот же массив.

        for (int i = 0; i < password.Length; i++)
            if (password[i] != storedPassword[i])
                return false;
        return true;
2
ответ дан 6 December 2019 в 10:49
поделиться

Equals не сравнивает байты двух массивов byte []. Вы должны сами сравнить каждый байт в двух массивах.

3
ответ дан 6 December 2019 в 10:49
поделиться

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;
}
0
ответ дан 6 December 2019 в 10:49
поделиться

Вы должны сравнивать каждый байт ваших массивов, вы можете сделать простой цикл или использовать метод SequenceEqual Linq Extension, если он доступен:

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

    return password.SequenceEqual(storedPassword);
}
13
ответ дан 6 December 2019 в 10:49
поделиться

Метод System.Array.Equals, похоже, проверяет только идентичность объектов, как и object.Equals.

Приходится писать цикл и сравнивать элементы самостоятельно.

0
ответ дан 6 December 2019 в 10:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: