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