如何为这个Hash函数生成Salt

本文关键字:函数 Salt Hash | 更新日期: 2023-09-27 18:17:01

我正在使用以下哈希函数,来自c#中的SO主题哈希和盐密码。我如何在字节数组格式生成盐值?

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);            
}

如何为这个Hash函数生成Salt

快速哈希算法,如MD5, SHA-1甚至SHA-256都不是哈希密码的好选择,因为它们太快了,很容易被暴力破解。使用普通硬件,每秒可以计算1千兆的SHA-256值。

相反,您可以使用慢速密钥派生函数,如BCrypt或PBKDF2。CSharp对PBKDF2有原生支持,它可以通过Rfc2898DeriveBytes类实现,你可以在这里找到一个例子。

同样易于使用的是这个BCrypt库。人们常常不确定使用这样的库是否安全,但没有理由反对使用它。只要库返回正确的值并正确生成salt,就应该没问题,因为安全性来自算法,而不是来自实现。