ASP.NET Membership C# – 如何比较现有的密码/哈希

我一直在讨论这个问题。 我需要将用户输入的paasword与会员数据库中的密码进行比较。 密码经过哈希处理并且有盐。 由于缺少文档,我不知道盐是否附加到密码,然后散列如何创建它。

我无法得到这个匹配。 从函数返回的散列永远不会匹配数据库中的散列,我知道它是相同的密码。 微软似乎以与我不同的方式对密码进行哈希处理。

我希望有人有一些见解。

这是我的代码:

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这样的工具,您可以看到成员资格提供程序的function。 这是过去对我有用的东西(假设passwordFormat 1,即SHA1):

 public static string GenerateHash(string pwd, string saltAsBase64) { byte[] p1 = Convert.FromBase64String(saltAsBase64); return GenerateHash(pwd, p1); } public static string GenerateHash(string pwd, byte[] saltAsByteArray) { System.Security.Cryptography.SHA1 sha = new System.Security.Cryptography.SHA1CryptoServiceProvider(); byte[] p1 = saltAsByteArray; byte[] p2 = System.Text.Encoding.Unicode.GetBytes(pwd); byte[] data = new byte[p1.Length + p2.Length]; p1.CopyTo(data, 0); p2.CopyTo(data, p1.Length); byte[] result = sha.ComputeHash(data); string res = Convert.ToBase64String(result); return res; } 

其中:“saltAsBase64”来自aspnet_Membership表的PasswordSalt列。

编辑:

用法示例:

  string pwd = "Letmein44"; string saltAsBase64 = "SuY4cf8wJXJAVEr3xjz4Dg=="; string hash = GenerateHash(pwd, saltAsBase64); // hash : "mPrDArrWt1+tybrjA0OZuEG1P5w=" 

这么多工作! 微软让生活变得更轻松:

string myhash = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(password + salt,“SHA1”);