Я немного озадачен тем, как представить это без «утечки» информации о безопасности или даже того, является ли это проблемой для этого сообщения.
Пожалуйста, сообщите в комментарии, если я должен добавить проблемнуюхэш и пароль, и я буду более чем счастлив сделать это при редактировании.
Достаточно сказать, что пользователь, которого я создал с помощью ASP.NET Identity, как показано ниже, не может войти в систему. IИспользовал ILSpy для разделения метода PasswordSignIn
и смог проверить, существует ли пользователь с указанным именем пользователя и что сбой, по-видимому, связан с проверкой пароля.
Вот кодс помощью которого я создаю пользователя:
var userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context));
var user = new ApplicationUser { UserName = "user@domain.tdl", Email = "user@domain.tdl" };
var userPassword = "p455W@rd";
var userCheck = userManager.Create(user, userPassword);
Пользователь создан, но когда я пытаюсь войти в систему с паролем, происходит сбой входа.
Я на самом деле посеялэтого пользователя в мою базу данных, чтобы получить настоящий хеш исключительно для пользы этого поста.
Используя приведенный ниже код, взятый из ASP.NET Identity с ILSpy для проверки пароля,Пароли sh и обычного текста совпадают.
(Вы можете скопировать этот код непосредственно в dotnetfiddle, если хотите).
Однако, есть логин, который я создал точно так же, как хэш иобычные текстовые пароли не проходят эту проверку.
Есть идеи, почему будет создан хеш, который не будет возвращен к исходному значению?
public static void Main()
{
var hashedPassword = "AA29ol/cj3GsR+yEjQWcQufmOvJCy7kZMIiSTMfxCdeXpeeLy2npjVpndBlfRS8kxQ==";
var password = "p455W@rd";
var array = Convert.FromBase64String(hashedPassword);
if (array.Length != 49 || array[0] != 0)
{
Console.WriteLine("Array length wasn't 49 or the first item in the array wasn't 0");
}
var array2 = new byte[16];
Buffer.BlockCopy(array, 1, array2, 0, 16);
var array3 = new byte[32];
Buffer.BlockCopy(array, 17, array3, 0, 32);
byte[] bytes;
using (Rfc2898DeriveBytes rfc2898DeriveBytes = new Rfc2898DeriveBytes(password, array2, 1000))
{
bytes = rfc2898DeriveBytes.GetBytes(32);
}
var equals = ByteArraysEqual(array3, bytes);
if (equals)
{
Console.WriteLine("Arrays equal");
}
else
{
Console.WriteLine("Arrays do not equal");
}
}
public static bool ByteArraysEqual(byte[] a, byte[] b)
{
if (object.ReferenceEquals(a, b))
{
return true;
}
if (a == null || b == null || a.Length != b.Length)
{
return false;
}
bool flag = true;
for (int i = 0; i <a.Length; i++)
{
flag &= (a[i] == b[i]);
}
return flag;
}