使用字符串salt生成密码哈希

时间:2018-05-11 18:40:39

标签: c# api asp.net-core passwords .net-core

我正在使用.NET Core的REST Api上使用.Net Framework身份验证的现有数据库。

我有一个aspnet_Users表,其中包含usernameaspnet_Membership表,其中包含passwordHashpasswordSalt

我的想法是通过使用salt生成哈希来验证密码,并与登录请求中提供的字符串密码进行比较。但...

数据库上的passwordHashpasswordSalt存储为字符串。

我的问题是:如何使用字符串salt生成哈希值。我习惯byte[]而不是string ...

3 个答案:

答案 0 :(得分:2)

感谢:https://stackoverflow.com/posts/2138588

static byte[] GenerateSaltedHash(byte[] plainText, byte[] salt)
{
  HashAlgorithm algorithm = new SHA256Managed();

  byte[] plainTextWithSaltBytes = 
    new byte[plainText.Length + salt.Length];

  for (int i = 0; i < plainText.Length; i++)
  {
    plainTextWithSaltBytes[i] = plainText[i];
  }
  for (int i = 0; i < salt.Length; i++)
  {
    plainTextWithSaltBytes[plainText.Length + i] = salt[i];
  }

  return algorithm.ComputeHash(plainTextWithSaltBytes);            
}

您可以使用Encoding.UTF8.GetBytes(string)将文本转换为字节数组。如果必须将哈希值转换为其字符串表示形式,则可以使用Convert.ToBase64StringConvert.FromBase64String将其转换回来。

你应该注意到你不能在字节数组上使用相等运算符,它会检查引用,所以你应该简单地遍历两个数组来检查每个字节

public static bool CompareByteArrays(byte[] array1, byte[] array2)
{
  if (array1.Length != array2.Length)
  {
    return false;
  }

  for (int i = 0; i < array1.Length; i++)
  {
    if (array1[i] != array2[i])
    {
      return false;
    }
  }

  return true;
}

答案 1 :(得分:1)

要回答您的问题,将字符串转换为byte []的最简单方法是使用System.Text.Encoding.UTF8.GetBytes()

话虽如此,您应该调查是否要自己编写密码验证代码,因为the common sentiment is that you should avoid it。那里有一个可以为你做这件事的图书馆。

答案 2 :(得分:1)

嗯,你没有说你想要什么样的哈希;)所以这是我一直用于我的项目的一个。它由我的前工程师工程师编写。

之前我查看过这段代码。您可以尝试调试以查看是否确实需要互斥对象。我对此表示怀疑,但为您提供原始代码总是更安全,因此您可以使用它。

{{1}}