首页 > 解决方案 > 登录时 ASP.NET 身份密码哈希与纯文本密码不匹配

问题描述

我有点困惑如何在不“泄露”安全信息的情况下呈现这一点,甚至这是否是这篇文章的一个问题。

如果我应该添加有问题的哈希和密码,请在评论中提出建议,我很乐意在编辑中这样做。

可以说我使用 ASP.NET 身份创建的用户无法登录,我已经使用 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);

用户已创建,但是当我尝试使用密码登录时,登录失败。

我实际上已经将此用户播种到我的数据库中,以便仅为了这篇文章的利益而获得实际的哈希值。

使用下面的代码,我用 ILSpy 从 ASP.NET Identity 中取出来验证密码,这个哈希和纯文本密码匹配。

(如果您愿意,可以将此代码直接复制到 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;
}

标签: c#cryptographyasp.net-identity-2

解决方案


推荐阅读