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

时间:2010-04-21 23:15:58

标签: c# security asp.net-membership 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);
    }

2 个答案:

答案 0 :(得分:8)

使用像Reflector这样的工具,您可以看到会员提供商的工作。 这是过去对我有用的东西(假设密码格式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="    

答案 1 :(得分:2)

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

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