Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ASP.NET成员身份C#-如何比较现有密码/哈希_C#_Security_Asp.net Membership_Membership_Membership Provider - Fatal编程技术网

ASP.NET成员身份C#-如何比较现有密码/哈希

ASP.NET成员身份C#-如何比较现有密码/哈希,c#,security,asp.net-membership,membership,membership-provider,C#,Security,Asp.net Membership,Membership,Membership Provider,我研究这个问题已经有一段时间了。我需要将用户输入的PaaWord与成员数据库中的密码进行比较。密码是散列的,有一个盐。 由于缺少文档,我不知道salt是否附加到密码中,然后如何创建它 我无法让它匹配。从函数返回的哈希与数据库中的哈希不匹配,我知道它实际上是同一个密码。微软似乎以一种与我不同的方式来散列密码 我希望有人有一些见解 这是我的密码: protected void Button1_Click(object sender, EventArgs e) { //

我研究这个问题已经有一段时间了。我需要将用户输入的PaaWord与成员数据库中的密码进行比较。密码是散列的,有一个盐。 由于缺少文档,我不知道salt是否附加到密码中,然后如何创建它

我无法让它匹配。从函数返回的哈希与数据库中的哈希不匹配,我知道它实际上是同一个密码。微软似乎以一种与我不同的方式来散列密码

我希望有人有一些见解

这是我的密码:

 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之类的工具,您可以看到成员资格提供程序的功能

这就是我过去的工作(假设passwordFormat 1,即SHA1):

其中
saltAsBase64
来自
aspnet\u成员资格表的
PasswordSalt

编辑:

用法示例:

string pwd = "Letmein44";
string saltAsBase64 = "SuY4cf8wJXJAVEr3xjz4Dg==";

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

这么多工作!Microsoft使用HashPasswordForStoringInfigfile使生活更加轻松:

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

我不认为这是op想要的。给定用户的原始密码和base64编码的salt(来自aspnet_成员表的PasswordSalt列),您应该能够生成该aspnet_成员表行的password列。虽然它看起来像一个方便的函数,但它似乎并没有做到这一点。你是对的。乍一看,你确实很适合这份工作。我想这就是为什么我没有想到的原因。@Moe,你是最好的,你救了我。我不知道该如何感谢你。如果有什么我能做的,就说出来吧。谢谢大家的投入,大家都帮了大忙。我只希望有一天我能像你一样好,也能帮助别人。如果您使用上面的代码来散列和比较安全性答案,请确保像SqlMembershipProvider那样执行
passwordAnswer.ToLower(CultureInfo.InvariantCulture)
。如果没有
ToLower()
,计算的哈希值将不同于存储的安全应答哈希值。
string myhash = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(password + salt, "SHA1");