Хэш пароля идентификации ASP.NET не совпадает с простым текстовым паролем при входе в систему - PullRequest
0 голосов
/ 04 октября 2018

Я немного озадачен тем, как представить это без «утечки» информации о безопасности или даже того, является ли это проблемой для этого сообщения.

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

Достаточно сказать, что пользователь, которого я создал с помощью 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;
}
...