我有这个asp.net项目,我需要哈希密码(最好用盐)并将其保存在sql数据库中然后取消它以便与登录密码进行比较或者......就像那样.... 问题是我不确定以最安全的方式做到这一点的最佳方法是什么?如何用C#编写代码?
答案 0 :(得分:4)
你不要吵架。这就是散列的重点:它无法逆转。
你查找盐,然后将他们输入的密码与盐一起哈希。如果散列与数据库中的散列相同,则它是有效的登录。
也许看看这里: Salted password hashing
答案 1 :(得分:3)
首先you cannot recover the hashed data
。它的one way process
。但是您可以匹配散列数据。为此,请检查以下代码:
在按钮点击事件
中执行此操作string salt = GetSalt(10); // 10 is the size of Salt
string hashedPass = HashPassword(salt, Password.Text);
这些功能可以帮助您散列密码
const string alphanumeric = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";
public static string GetSalt(int saltSize)
{
Random r = new Random();
StringBuilder strB = new StringBuilder("");
while ((saltSize--) > 0)
strB.Append(alphanumeric[(int)(r.NextDouble() * alphanumeric.Length)]);
return strB.ToString();
}
public static string HashPassword(string salt, string password)
{
string mergedPass = string.Concat(salt, password);
return EncryptUsingMD5(mergedPass);
}
public static string EncryptUsingMD5(string inputStr)
{
using (MD5 md5Hash = MD5.Create())
{
// Convert the input string to a byte array and compute the hash.
byte[] data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(inputStr));
// Create a new Stringbuilder to collect the bytes
// and create a string.
StringBuilder sBuilder = new StringBuilder();
// Loop through each byte of the hashed data
// and format each one as a hexadecimal string.
for (int i = 0; i < data.Length; i++)
sBuilder.Append(data[i].ToString("x2"));
// Return the hexadecimal string.
return sBuilder.ToString();
}
}
同样,当您尝试匹配密码以验证用户身份时,执行相同的方法只需从数据库中获取散列密码并进行比较。如果输入的散列密码与数据库哈希密码匹配,则为其授权用户。
已更新:
首次散列用户密码,然后在同一个表中存储到数据库中时,存储该用户的salt。
- 醇>
下次尝试比较密码时,从数据库中获取用户的盐并使用哈希值进行比较 数据库中的哈希密码。
希望能回答你的问题。