0

我目前正在从事一个具有明文密码的项目。现在我们需要将所有明文密码更改为 HASH。数据库具有密码字段和密码盐字段。

我在 .Net 中尝试了以下操作(我发现 .Net 4 使用 HMACSHA256 算法)用数据库中已有的盐对密码进行哈希处理。

// I retrieved the password and salt from database and hashed it
string authDetails = row["Password"] + row["PasswordSalt"].ToString(); //password salt - value from database 
byte[] authBytes = System.Text.Encoding.UTF8.GetBytes(authDetails);

var hma = new System.Security.Cryptography.HMACSHA256();
byte[] hashedBytes = hma.ComputeHash(authBytes);
string hash = Convert.ToBase64String(hashedBytes);

并将上述哈希变量值存储在密码字段中。

我更改了配置设置 passwordFormat="hashed"。

如果我尝试使用密码登录,则登录失败。我无法使用旧密码登录。有任何想法吗?

谢谢!

编辑:只是为了澄清..我使用 asp.net 会员提供程序。我在 web.config 中将 PasswordFormat 更改为“Hashed”。然后我调用 Membership.ValidateUser 来验证登录。- 我认为它会自动对输入的密码进行哈希处理并与数据库匹配。但我想通过 validateuser 方法生成的哈希与我上面生成的哈希不同。

4

3 回答 3

2

HMAC 是键控散列/散列系列。当您生成它的新实例时,.net 会将密钥初始化为随机值。因此,您会得到不同的家庭成员,从而得到不同的结果。

原则上,您可以切换到普通 SHA256 或使用 salt 作为密钥,即HMACSHA256(key=salt,message=password). 但这是个坏主意。

您应该使用专门的密码散列函数,这很慢。请参阅如何安全地散列密码?有关密码散列的详细信息,请访问 security.SE。在 .net 中有Rfc2898DeriveBytes实现 PBKDF2-HMAC-SHA1 的。

于 2013-06-04T21:09:15.693 回答
0

您不需要使用使用 hashmac,而只需像 sha256 这样的哈希。hashmack 中的点是当 key 用于验证消息时使用,但密码盐渍不需要它,(hashmac 需要额外的参数,即 key)

所有你需要的是

sha256(password + salt)
于 2013-06-04T20:05:31.080 回答
0

如果我尝试使用密码登录,则登录失败。我无法使用旧密码登录。有任何想法吗?

当您登录时,您相信提供的用户名是正确的,并使用它来查找该用户的盐。然后,您使用用户输入的盐和密码来计算哈希,就像您首先更新密码时所做的那样。现在您可以将其与存储的密码进行比较。

所以你需要这样的代码:

string GetSalt(string username)
{
    string sql = "SELECT PasswordSalt FROM [users] WHERE username= @username";
    //connect to database and return that result
}

string ComputeHash(string username, string password)
{
    string salt = GetSalt(username);

    //should actually concatenate byte arrays, not strings
    byte[] authBytes = System.Text.Encoding.UTF8.GetBytes(password + salt);
    var hma = new System.Security.Cryptography.HMACSHA256();
    byte[] hashedBytes = hma.ComputeHash(authBytes);
    return Convert.ToBase64String(hashedBytes);
}

bool Login(string username, string password)
{
    string hash = ComputeHash(username, password);

    string sql = "SELECT COUNT(*) FROM [users] WHERE username= @username AND Password= @Hash";
    // run that and make sure you get a row back

}
于 2013-06-04T20:15:30.507 回答