C# 如何在asp.NETC中先用盐进行哈希,然后再进行去哈希#

C# 如何在asp.NETC中先用盐进行哈希,然后再进行去哈希#,c#,asp.net,hash,salt,C#,Asp.net,Hash,Salt,我有一个asp.net项目,我需要散列密码(最好是用salt)并将其保存在sql数据库中,然后将其取消散列,以便与登录密码或类似的内容进行比较。。。。 问题是,我不确定以最安全的方式做这件事的最佳方式是什么,我如何才能用C#编写代码?您不需要解压。这就是散列的要点:它不能被逆转 你查一下盐,然后把他们和盐一起输入的密码散列出来。如果哈希值与数据库中的哈希值相同,则为有效登录 也许你可以看看这里: 首先您无法恢复散列数据。它的单向过程。但您可以匹配散列数据。为此,请检查下面给出的代码: 在按钮单击

我有一个asp.net项目,我需要散列密码(最好是用salt)并将其保存在sql数据库中,然后将其取消散列,以便与登录密码或类似的内容进行比较。。。。
问题是,我不确定以最安全的方式做这件事的最佳方式是什么,我如何才能用C#编写代码?

您不需要解压。这就是散列的要点:它不能被逆转

你查一下盐,然后把他们和盐一起输入的密码散列出来。如果哈希值与数据库中的哈希值相同,则为有效登录

也许你可以看看这里:

首先
您无法恢复散列数据。它的
单向过程
。但您可以匹配散列数据。为此,请检查下面给出的代码:

在按钮单击事件中执行此操作

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();
                }
            }
const string alphanumeric=“abcdefghijklmnopqrstuvxyzabcdefghijklmnopqrstuvxyz1234567890”;
公共静态字符串GetSalt(int-saltSize)
{
随机r=新随机();
StringBuilder strB=新的StringBuilder(“”);
而((盐粒大小--)>0)
strB.Append(字母数字[(int)(r.NextDouble()*字母数字.Length)];
返回strB.ToString();
}
公共静态字符串HashPassword(字符串salt、字符串密码)
{
string mergedPass=string.Concat(salt,密码);
返回EncryptingUsingMD5(mergedPass);
}
公共静态字符串加密使用MD5(字符串输入str)
{
使用(MD5 md5Hash=MD5.Create())
{
//将输入字符串转换为字节数组并计算哈希。
byte[]data=md5Hash.ComputeHash(Encoding.UTF8.GetBytes(inputStr));
//创建新的Stringbuilder以收集字节
//并创建一个字符串。
StringBuilder sBuilder=新StringBuilder();
//循环遍历散列数据的每个字节
//并将每个字符串格式化为十六进制字符串。
for(int i=0;i
类似地,当您尝试匹配密码以验证用户身份时,执行相同的方法—从数据库中获取哈希密码并进行比较。如果输入的哈希密码与数据库哈希密码匹配,则为授权用户

更新:

  • 当您第一次散列用户的密码,然后将其存储到同一个表中的数据库中时,请为该用户存储salt

  • 下次尝试比较密码时,请从数据库中获取该用户的salt,并使用哈希将其与 数据库中的哈希密码


  • 希望这能回答你的问题

    您的方法是不正确的,并且“取消哈希”的功能将使哈希完全冗余。您只需在创建帐户时将密码散列到数据库中(查看SHA/HMAC SHA),然后每当用户尝试登录时,以完全相同的方式对其密码尝试进行散列,并根据存储在数据库中的散列测试散列…简单!这不是一个重复的问题…在这个链接中,答案对我来说是不完整的,因为它不建议使用代码,它只建议使用hash()…我知道我应该使用hash,但我正在寻找使用salt的最佳方法,了解sha256或md5等方法非常重要……人们请在投票前仔细阅读问题。投票否决某人是不公平的,因为你认为你需要为自己的问题投票。答案是X……但从代码中我看到每次salt都是随机的,所以当我想比较密码?…它不会给我另一个加密密码吗?…我也要保存salt吗?你能解释一下字母数字吗?字母数字字符串只是用来创建动态salt的字母和数字的集合。例如,它将生成类似于“2R9GMSZTH”的盐,用于哈希检查我的更新答案。关于如何匹配salt是否随机生成的第一个问题。@sara.y您将salt和散列存储在数据库中。每位用户一份盐。你不应该使用MD5。它已经过时,不再被认为是安全的。链接建议使用RNGCryptoServiceProvider类,但是我发现msdn中的示例代码有点混乱。我应该如何在这里使用它?我认为他们只使用它创建一个随机字节[],然后将该字节[]转换为字符串。首先,实例化一个字节[]:字节[]salt=新字节[24];然后用随机值填充它:RNGCryptoServiceProvider csprng=new RNGCryptoServiceProvider();csprng.GetBytes(salt);