哈希算法 SHA256,我的方法安全吗?如何添加盐值以使其更安全

Hash algorithm SHA256, is my method secure? How do I add a salt value to make more secure

我对密码学还很陌生,想了解哈希算法。

我有以下来源来创建密码的散列版本,可以将其存储在我的数据库中。

    public static string hashPasswordGenerator(string password)
    {
        System.Security.Cryptography.SHA256Managed crypt = new System.Security.Cryptography.SHA256Managed();
        StringBuilder hash = new StringBuilder();
        byte[] cry = crypt.ComputeHash(Encoding.UTF8.GetBytes(password), 0, Encoding.UTF8.GetByteCount(password));
        return Convert.ToBase64String(cry);
    }

我的示例用户是 User1,密码 Password1,这个 returns 是 GVE/3J2k+3KkoF62aRdUjTyQ/5TVQZ4fI2PuqJ3+4d0=

的散列版本

我的问题是:

  1. Is this secure?
  2. Should I add a salt to this? If so can someone show me a simple example as I do not really understand how the salt it generated so that it will match the password every time?
  3. If someone has this hashPasswordGenerator method could they reverse engineer my password?

提前致谢。

Is this secure?

如果您只是使用不加盐的 SHA2,则不是。 (不是说 SHA2 可以轻易逆转)

Should I add a salt to this?

是的。

If so can someone show me a simple example

使用RNGCryptoServiceProvider:

RNGCryptoServiceProvider rngCsp = new RNGCryptoServiceProvider();
var salt = new byte[32];
rngCsp.GetBytes(salt); // this will fill the buffer with random values

as I do not really understand how the salt it generated so that it will match the password every time

您必须保存盐(每个密码必须是唯一的)以及散列(密码+盐)。

If someone has this hashPasswordGenerator method could they reverse engineer my password?

是的,如果它是字典密码并且您不使用盐。否则不会(在可预见的未来),因为哈希应该很难逆转。

顺便说一句,与其尝试重新发明轮子,您应该考虑使用 PBKDF2 来满足您的密码散列需求,因为它有一个工作因素可以减缓暴力攻击(迭代次数)。

Is this secure?

是的,不是。问题应该是 "Is this secure enough for my requirements?",这是只有你能回答的问题。

Should I add a salt to this?

是的,你应该。

If someone has this hashPasswordGenerator method could they reverse engineer my password?

不,他们做不到。在最坏的情况下,它会将他们指向正确的方向以进行暴力破解。

你的解决方案目前的问题是它太容易破解了。

第一个问题显然是缺少盐值,这意味着如果 2 个用户使用相同的密码,他们将具有相同的哈希值,这使得多个帐户更容易受到威胁。

其次,SHA256 太快了,无法生成安全的密码哈希值。你应该使用 bcrypt 或类似的东西,你可以控制轮数来生成哈希 "slow"。您希望它变慢的原因是因为您的应用程序一次只需要生成一个散列,所以如果在计算上生成一个 has 的时间是使用 SHA256 的 10000 倍,这没什么大不了的,但是黑客需要生成数十亿个哈希值。因此,让他花费 10000 倍的时间是一件大事。