ASP.NET成员身份C#-如何比较现有密码/哈希
我研究这个问题已经有一段时间了。我需要将用户输入的PaaWord与成员数据库中的密码进行比较。密码是散列的,有一个盐。 由于缺少文档,我不知道salt是否附加到密码中,然后如何创建它 我无法让它匹配。从函数返回的哈希与数据库中的哈希不匹配,我知道它实际上是同一个密码。微软似乎以一种与我不同的方式来散列密码 我希望有人有一些见解 这是我的密码:ASP.NET成员身份C#-如何比较现有密码/哈希,c#,security,asp.net-membership,membership,membership-provider,C#,Security,Asp.net Membership,Membership,Membership Provider,我研究这个问题已经有一段时间了。我需要将用户输入的PaaWord与成员数据库中的密码进行比较。密码是散列的,有一个盐。 由于缺少文档,我不知道salt是否附加到密码中,然后如何创建它 我无法让它匹配。从函数返回的哈希与数据库中的哈希不匹配,我知道它实际上是同一个密码。微软似乎以一种与我不同的方式来散列密码 我希望有人有一些见解 这是我的密码: protected void Button1_Click(object sender, EventArgs e) { //
protected void Button1_Click(object sender, EventArgs e)
{
//HERE IS THE PASSWORD I USE, SAME ONE IS HASHED IN THE DB
string pwd = "Letmein44";
//HERE IS THE SALT FROM THE DB
string saltVar = "SuY4cf8wJXJAVEr3xjz4Dg==";
//HERE IS THE PASSWORD THE WAY IT STORED IN THE DB AS HASH
string bdPwd = "mPrDArrWt1+tybrjA0OZuEG1P5w=";
// FOR COMPARISON I DISPLAY IT
TextBox1.Text = bdPwd;
// HERE IS WHERE I DISPLAY THE return from THE FUNCTION, IT SHOULD MATCH THE PASSWORD FROM THE DB.
TextBox2.Text = getHashedPassUsingUserIdAsSalt(pwd, saltVar);
}
private string getHashedPassUsingUserIdAsSalt(string vPass, string vSalt)
{
string vSourceText = vPass + vSalt;
System.Text.UnicodeEncoding vUe = new System.Text.UnicodeEncoding();
byte[] vSourceBytes = vUe.GetBytes(vSourceText);
System.Security.Cryptography.SHA1CryptoServiceProvider vSHA = new System.Security.Cryptography.SHA1CryptoServiceProvider();
byte[] vHashBytes = vSHA.ComputeHash(vSourceBytes);
return Convert.ToBase64String(vHashBytes);
}
使用Reflector之类的工具,您可以看到成员资格提供程序的功能 这就是我过去的工作(假设passwordFormat 1,即SHA1): 其中
saltAsBase64
来自aspnet\u成员资格表的PasswordSalt
列
编辑:
用法示例:
string pwd = "Letmein44";
string saltAsBase64 = "SuY4cf8wJXJAVEr3xjz4Dg==";
string hash = GenerateHash(pwd, saltAsBase64);
// hash : "mPrDArrWt1+tybrjA0OZuEG1P5w="
这么多工作!Microsoft使用HashPasswordForStoringInfigfile使生活更加轻松:
string myhash = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(password + salt, "SHA1");
我不认为这是op想要的。给定用户的原始密码和base64编码的salt(来自aspnet_成员表的PasswordSalt列),您应该能够生成该aspnet_成员表行的password列。虽然它看起来像一个方便的函数,但它似乎并没有做到这一点。你是对的。乍一看,你确实很适合这份工作。我想这就是为什么我没有想到的原因。@Moe,你是最好的,你救了我。我不知道该如何感谢你。如果有什么我能做的,就说出来吧。谢谢大家的投入,大家都帮了大忙。我只希望有一天我能像你一样好,也能帮助别人。如果您使用上面的代码来散列和比较安全性答案,请确保像SqlMembershipProvider那样执行passwordAnswer.ToLower(CultureInfo.InvariantCulture)
。如果没有ToLower()
,计算的哈希值将不同于存储的安全应答哈希值。
string myhash = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(password + salt, "SHA1");