Ste*_*eve 2 c# membership security asp.net-membership membership-provider
我一直在讨论这个问题.我需要将用户输入的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);
}
Run Code Online (Sandbox Code Playgroud)
使用像Reflector这样的工具,您可以看到成员资格提供程序的功能.这是过去对我有用的东西(假设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;
}
Run Code Online (Sandbox Code Playgroud)
其中:"saltAsBase64"来自aspnet_Membership表的PasswordSalt列.
编辑:
用法示例:
string pwd = "Letmein44";
string saltAsBase64 = "SuY4cf8wJXJAVEr3xjz4Dg==";
string hash = GenerateHash(pwd, saltAsBase64);
// hash : "mPrDArrWt1+tybrjA0OZuEG1P5w="
Run Code Online (Sandbox Code Playgroud)