【问题标题】:How to hash with salt then unhash in asp.net C# [duplicate]如何用盐散列然后在asp.net C#中取消散列[重复]
【发布时间】:2014-08-02 15:01:40
【问题描述】:

我有这个 asp.net 项目,我需要对密码进行哈希处理(最好使用 salt)并将其保存在 sql 数据库中,然后取消哈希处理以与登录密码或类似的东西进行比较...... 问题是我不确定以最安全的方式执行此操作的最佳方法是什么,以及如何在 C# 中进行编码?

【问题讨论】:

  • 您的方法不正确,“取消散列”散列的能力会使散列完全多余。您需要做的就是在创建帐户时将密码散列到数据库中(查看 SHA / HMAC SHA),然后每当用户尝试登录时,以完全相同的方式散列他们的密码尝试,并测试散列针对存储在数据库中的哈希...简单!
  • 这不是一个重复的问题......在那个链接中,答案对我来说是不完整的,因为它不会建议代码,它只是建议 hash()......我知道我应该使用散列,但我正在寻找使用盐的最佳方法,了解 sha256 或 md5 之类的方法非常重要......人们请在投票前仔细阅读这个问题,因为你认为你投票反对某人是不公平的需要为您自己的问题投票

标签: c# asp.net hash salt


【解决方案1】:

您不会取消散列。这就是散列的意义:它无法逆转。

您查找盐,然后将他们输入的密码与盐一起散列。如果哈希值与数据库中的哈希值相同,则为有效登录。

也许看看这里: Salted password hashing

【讨论】:

  • 链接建议使用 RNGCryptoServiceProvider 类,但是我发现 msdn 中的示例代码有点令人困惑..我应该如何在这里使用它?
  • 我认为他们只使用它来创建一个随机字节 [],然后将该字节 [] 转换为字符串。首先,实例化一个 byte[]: byte[] salt = new byte[24];然后用随机值填充它: RNGCryptoServiceProvider csprng = new RNGCryptoServiceProvider(); csprng.GetBytes(salt);
【解决方案2】:

首先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();
                }
            }

同样,当您尝试匹配密码以验证用户身份时,执行相同的方法,只需从数据库中获取您的散列密码并进行比较。如果输入的哈希密码与数据库哈希密码匹配,则为授权用户。

更新:

  1. 当您第一次对用户的密码进行哈希处理,然后将其存储到数据库中的同一个表中时,存储该用户的盐值。

  2. 下次当您尝试比较密码时,请从数据库中获取用户的盐值并使用哈希值与密码进行比较 数据库中的哈希密码。

希望能回答您的问题。

【讨论】:

  • tnx 的答案...但是从代码中我看到盐每次都是随机的,所以当我想比较密码时会发生什么?...它不会给我另一个加密密码?...我也要保存盐吗?
  • 你能解释一下字母数字吗?
  • 字母数字字符串不过是用于创建动态盐的字母和数字的集合。例如,它会为散列生成像“2R9GmSZzth”这样的盐
  • 检查我更新的答案。如果盐是随机生成的,您的第一个问题是如何匹配。
  • @sara.y 您将 salt 和 hash 都存储在数据库中。每位用户一份盐。而且你不应该使用 MD5。它已经过时并且不再被认为是安全的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-08
  • 1970-01-01
  • 2013-08-29
  • 1970-01-01
相关资源
最近更新 更多