Я пытаюсь проверить чей-то пароль при входе в систему.
Я беру введенный пароль и получаю сохраненную хешированную соль пароля и пароля пользователей.
Затем я хеширую введенный пароль с сохраненной солью, чтобы видеть, равно ли это сохраненному паролю.
Однако даже при том, что байт [] 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;
}
Вы должны перебирать элементы массива, чтобы увидеть, совпадают ли они. Использование метода .Equals ()
сообщает вам, только если две переменные ссылаются на один и тот же массив.
for (int i = 0; i < password.Length; i++)
if (password[i] != storedPassword[i])
return false;
return true;
Equals не сравнивает байты двух массивов byte []. Вы должны сами сравнить каждый байт в двух массивах.
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;
}
Вы должны сравнивать каждый байт ваших массивов, вы можете сделать простой цикл или использовать метод SequenceEqual
Linq Extension, если он доступен:
public static bool VerifyPassword(byte[] newPassword, byte[] storedPassword,
byte[] storedSalt)
{
byte[] password = CreateHashedPassword(newPassword, storedSalt);
return password.SequenceEqual(storedPassword);
}
Метод System.Array.Equals, похоже, проверяет только идентичность объектов, как и object.Equals.
Приходится писать цикл и сравнивать элементы самостоятельно.