2

我一直在这个问题一段时间。我需要将用户输入的paasword与成员资格DB中的密码进行比较。密码被散列并且有盐。 由于缺少文档,我不知道salt是否附加到密码,然后散列它是如何创建的。ASP.NET会员C# - 如何比较现有密码/散列

我无法得到此结果。从函数返回的哈希从不匹配数据库中的哈希,我知道它实际上是相同的密码。微软似乎以不同的方式散列密码,那么我就是。

我希望有人有一些见解请。

这里是我的代码:

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); 
    } 

回答

8

使用诸如反射器的工具,你可以看到成员提供做什么。 这是在过去的工作对我来说(假设了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="  
+0

@Moe,你是最棒的,你救了我。我不知道该如何谢谢你。 如果有什么我能做的,就说出来。 谢谢大家的所有意见,你们都非常乐于助人。我只希望有一天我会和你一样好,也能帮助别人。 Steve – Steve 2010-04-26 19:27:29

+1

如果您使用上面的代码来散列和比较安全性答案,请确保像SqlMembershipProvider那样执行'passwordAnswer.ToLower(CultureInfo.InvariantCulture)'。如果没有'ToLower()',计算出来的哈希将与存储的安全答案哈希不同。 – 2014-06-25 05:31:26

2

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

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

+0

我不认为这是做什么的操作。考虑到用户的原始密码和base64编码盐(来自aspnet_Membership表的PasswordSalt列),您应该能够生成该aspnet_Membership表行的密码列。虽然它看起来像一个方便的功能,但这似乎并没有做到这一点。 – 2010-04-22 02:01:06

+0

你是对的。乍一看,手头的工作看起来不错。我想这就是为什么它不能直接记住。 – 2010-04-22 03:32:41