c# - 登录时 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;
}
解决方案
推荐阅读
- ajax - ajax中的总分不能与laravel一起使用
- emacs - Emacs 完成列表,一个选项是另一个选项的前缀
- c++ - 如何在 Visual Basic 中使用矩形函数 OpenGL 绘制矩形
- css - How to keep a seperate div open from a css selector
- python - How can I omitt certain lines from an Nmap output scan?
- android - 在手机上运行时出错,但在模拟器上运行时出错
- javascript - 如何跨位于多个文件中的多个组件共享 JSS 类?
- sql-server-2014 - 作为系统管理员和 XP_CMDSHELL 执行
- javascript - axios get requests and displaying in table
- r - In R how can I fill downwards for all rows which match one variable and don't match another