我正在编写一个登录系统,用于登录 DotNetNuke 应用程序的数据库。我可以访问数据库并且可以读取 aspnet_Membership 表中的 PasswordSalt。因此,我将有以下输入:
- 用户密码(表单提交)
- 用户的盐(我可以查)
并且我必须生成散列密码作为输出。 PasswordFormat=2,即“已加密”。但是,我无法找到正在使用的加密算法的详细信息,因此我无法在自己的应用程序中重写它。到目前为止,我的研究导致了这个页面:
http://msdn.microsoft.com/en-us/library/aa478949.aspx
还有this SO post ,其中一条评论中有以下公式:
Convert.ToBase64String((new Rfc2898DeriveBytes(YourPWD, YourSALT)).GetBytes(20))
但是,这个公式似乎不适用于我的测试数据,它具有以下输入和输出:
- 密码:888888
- 盐:ahEvjCX3FM04S5cSi1qdHA==
- 散列密码:y3rxLUDYdj1/+IGC94/tvW6M3pQTCi/9bq1cNOUgYlM=
你可以在这里看到我的测试:http://ideone.com/EClO2
using System;
using System.Security.Cryptography;
public class Test
{
public static void Main()
{
Console.WriteLine(Convert.ToBase64String((new Rfc2898DeriveBytes("888888", System.Convert.FromBase64String("ahEvjCX3FM04S5cSi1qdHA=="))).GetBytes(20)));
}
}
感谢您的帮助!
更新
在这里回答:ASP.NET MembershipProvider -- How exactly does it do encryption?
最佳答案
查看源代码,他们有一个名为 AspNetMembershipProvider
的类,它有一个名为 UserLogin
的方法。 UserLogin
调用一个名为 ValidateUser
的私有(private)方法,该方法又使用 ASP.NET 成员身份提供程序,因此它实际上调用了此方法 Membership.ValidateUser内部。
因此,如果您使用用户名和密码调用相同的方法,成员(member)提供程序将处理密码散列并返回一个 bool 值,指示密码是否匹配。
关于c# - DotNetNuke 如何散列其密码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12418932/