.net 将明文密码转换为哈希-相同的盐

.net 将明文密码转换为哈希-相同的盐,.net,hash,cryptography,.net,Hash,Cryptography,我目前正在从事一个有明文密码的项目。现在我们需要将所有明文密码更改为哈希。 数据库有密码字段和密码字段 我在.Net中尝试了以下方法(我发现.NET4使用HMACSHA256算法)用数据库中已有的salt对密码进行散列 // I retrieved the password and salt from database and hashed it string authDetails = row["Password"] + row["PasswordSalt"].ToString(); //pa

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

我在.Net中尝试了以下方法(我发现.NET4使用HMACSHA256算法)用数据库中已有的salt对密码进行散列

// 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中将密码格式更改为“哈希”。然后我调用Membership.ValidateUser来验证登录。-我认为它会自动对输入的密码进行哈希运算,并与数据库进行匹配。但是我假设validateuser方法生成的哈希与我上面生成的哈希不同

您不需要使用hashmac,只需像sha256一样进行散列即可。hashmack中的要点是,当密钥用于验证消息时使用它,但密码加密不需要它(hashmack使用作为密钥的额外参数)

你所需要的只是

sha256(password + salt)
如果我尝试使用密码登录,则登录失败。我不能用旧密码登录。有什么想法吗

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

所以您需要这样的代码:

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

}

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

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


您应该使用一个专门的密码哈希函数,这很慢。有关密码哈希的详细信息,请参阅。在.net中,有
Rfc2898DeriveBytes
实现了PBKDF2-HMAC-SHA1。

您如何告诉密码检查算法要使用哪种salt?不太清楚如何对哈希进行salt。。。您基本上是通过将salt提供给hash算法来散列密码,而不是将密码和salt连接起来,然后散列。@J.Steen:不一定。来自维基百科关于salt的文章:“在一个典型的设置中,salt和密码是通过加密散列函数连接和处理的”。如果我不使用相同的salt,我如何散列现有的明文密码?请纠正我/请告诉我如何实现我的目标不使用salt…并将上述hash var值存储在password字段中,这是否意味着下次检查密码时,您正在重新设置hash??您可能需要澄清现有密码是如何散列的,以及如何根据这些散列检查密码输入的。谢谢,使用它来散列System.Security.Cryptography.SHA256CryptoServiceProvider();(password+salt)即使这样我也无法登录您所说的使用此密码的方法,您如何根据数据库检查密码?我使用asp.net成员资格提供程序。我在web.config中将密码格式更改为“哈希”。然后我调用Membership.ValidateUser来验证登录。-我认为它会自动对输入的密码进行哈希运算,并与数据库进行匹配。但是我想这里生成的哈希与我上面生成的哈希不一样。我在web.config中将passwordFormat更改为“Hashed”。。当我调用Membership.ValidateUser时,您提到的上述步骤将由.net自动完成,对吗?哦,很好,您正在使用会员资格提供程序。你需要阅读这篇文章:+1海报从技术上讲是在问如何通过将设置更改为糟糕的单哈希版本来迁移他现有的内置.net成员资格提供商,但我更喜欢你的答案。