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

use*_*707 5 c# security hash cryptography sha256

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

我有以下来源来创建密码的哈希版本,该密码可以存储在我的数据库中。

    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);
    }
Run Code Online (Sandbox Code Playgroud)

我的示例用户User1使用密码Password1,这返回哈希版本GVE/3J2k+3KkoF62aRdUjTyQ/5TVQZ4fI2PuqJ3+4d0=

我的问题是:

  1. 这安全吗?
  2. 我应该加盐吗?如果是这样,有人可以给我看一个简单的例子,因为我真的不明白它是如何生成盐的,以便它每次都会匹配密码?
  3. 如果有人有这个 hashPasswordGenerator 方法,他们可以对我的密码进行逆向工程吗?

提前致谢。

Nas*_*ine 5

这安全吗?

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

我应该加盐吗?

是的。

如果是这样,有人可以给我看一个简单的例子吗

使用RNGCryptoServiceProvider

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

因为我不太明白它是如何生成盐的,以便它每次都会匹配密码

您必须将盐(对于每个密码来说必须是唯一的)与散列(密码+盐)一起保存。

如果有人有这种hashPasswordGenerator方法,他们可以对我的密码进行逆向工程吗?

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

顺便说一句,您应该考虑使用PBKDF2来满足您的密码哈希需求,而不是尝试重新发明轮子,因为它的工作因素可以减慢暴力攻击(迭代次数)。