InCorrect输出使用Rfc2898DeriveBytes进行密码散列

时间:2011-11-15 10:18:27

标签: c# .net hash cryptography symmetric-key

我当然肯定我在做错了。使用算法的.net实现,我将密码与用于哈希的盐一起存储在数据库中。在使用现有哈希验证相同密码时不匹配。这是我的代码

新条目

byte[] SALT = GetRandomKey();
string password = Convert.ToBase64String((new Rfc2898DeriveBytes(txtPassword.Text, SALT)).GetBytes(20));
Session["test"] = password;
Session["salt"] = Convert.ToBase64String(SALT);

验证

string HASHEDPASSWORD = Session["test"];
string SALT = Session["salt"];
string ouput = Convert.ToBase64String((new Rfc2898DeriveBytes(password, Encoding.Unicode.GetBytes(SALT))).GetBytes(20));
ltrResult.Text = HASHEDPASSWORD.Equals(ouput) ? "EQUAL" : "NOT EQUAL";

获取RandomKey方法

byte[] GetRandomKey()
    {
        byte[] secretkey = new Byte[64];
        RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
        rng.GetBytes(secretkey);
        return secretkey;
    }

3 个答案:

答案 0 :(得分:3)

Convert.FromBase64String代替Encoding.Unicode.GetBytes

答案 1 :(得分:1)

添加项目时使用Convert.ToBase64String,检索时使用Encoding.Unicode.GetBytes ...

在添加新条目时使用Encoding.Unicode.GetString,您的代码应该有效,例如:

private static string GetString(byte[] bytes)
{
    return Encoding.Unicode.GetString(bytes);
}

private static byte[] GetBytes(string value)
{
    return Encoding.Unicode.GetBytes(value);
}

<强>添加

byte[] salt = GetRandomKey();
byte[] hash = new Rfc2898DeriveBytes(txtPassword.Text, salt)).GetBytes(20);
Session["test"] = GetString(hash);
Session["salt"] = GetString(salt);

<强>检查

byte[] hash = GetBytes(Session["test"]);
byte[] salt = GetBytes(Session["salt"]);
byte[] output = new Rfc2898DeriveBytes(password, salt).GetBytes(20);
ltrResult.Text = GetString(hash).Equals(GetString(output)) ? "EQUAL" : "NOT EQUAL";

答案 2 :(得分:0)

您可以将salt存储为会话中的字节数组,以便在字符串和字节之间进行转换时不会产生任何编码差异:

byte[] SALT = GetRandomKey();
string password = Convert.ToBase64String((new Rfc2898DeriveBytes(txtPassword.Text, SALT)).GetBytes(20));
Session["test"] = password;
Session["salt"] = SALT;

然后验证给定的密码是否与您重复相同过程的哈希匹配:

string HASHEDPASSWORD = Session["test"];
byte[] SALT = Session["salt"] as byte[];
string ouput = Convert.ToBase64String((new Rfc2898DeriveBytes(password, SALT)).GetBytes(20));
ltrResult.Text = HASHEDPASSWORD.Equals(ouput) ? "EQUAL" : "NOT EQUAL";