哈希算法SHA256,我的方法安全吗?如何添加盐值以增加安全性。

5

我对密码学还比较陌生,想要了解哈希算法的原理。

我找到了以下资源,用于创建密码的哈希值,可以存储在我的数据库中。

    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,这将返回哈希版本GVE/3J2k+3KkoF62aRdUjTyQ/5TVQZ4fI2PuqJ3+4d0=

我的问题是:

  1. 这是否安全?
  2. 我应该添加盐吗?如果需要,有人能展示一个简单的例子吗?我不太了解如何生成盐以使其每次都与密码匹配。
  3. 如果有人拥有这个hashPasswordGenerator方法,他们能反向工程我的密码吗?

提前感谢。


在你的例子中,StringBuilder hash = new StringBuilder(); 从未被使用。 - Ashigore
可能是SHA-1用于密码存储是否安全?的重复问题(SHA-256和SHA-1在根本上并没有不同)。 - Artjom B.
你不应该使用简单的哈希函数来进行密码哈希。你需要使用故意缓慢的哈希函数,如PBKDF2、bcrypt、scrypt和Argon2。了解更多信息:如何安全地哈希密码? - Artjom B.
2个回答

5

这安全吗?

如果只使用SHA2而没有盐,那么不是很安全。(并不是说SHA2可以很容易地被破解)

我应该加盐吗?

是的。

如果需要,可以给我展示一个简单的例子吗?

使用RNGCryptoServiceProvider

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

我并不是很了解盐是如何生成的,以至于每次都可以与密码匹配。

你必须将盐(每个密码必须唯一)与加密后的(密码+盐)一起保存。

如果有人使用hashPasswordGenerator方法,他们能反向破解我的密码吗?

如果使用字典密码,并且没有使用盐,则可以。否则,在可预见的未来内是不可能的,因为哈希算法应该是难以被破解的。

此外,你应该考虑使用PBKDF2来进行密码哈希处理,因为它具有工作因子,可以减慢暴力攻击的速度(迭代次数)。


1
非常感谢您的回答。好的,盐应该如何存储,是在单独的字段中还是在同一字段中?PBLDF2上的示例为Convert.ToBase64String(salt) + "|" + Convert.ToBase64String(hash),这是一个以管道分隔的字符串吗? - user3284707
你可以将它存储在一个单独的字段中,因为这样读取时不需要解析字符串,更容易阅读。 - Nasreddine
那么这个盐值是在密码被哈希之前添加的,这意味着两个相同的密码永远不会被哈希成相同的值?因此,当密码输入时,我需要查找盐值,将其添加到明文密码中,然后进行哈希并检查它们是否匹配? - user3284707
是的,就这样。 - Nasreddine

2

这个安全吗?

是和不是。问题应该是“这对我的要求来说足够安全吗?”,只有您自己才能回答。

我应该加盐吗?

是的,您应该加盐。

如果有人拥有这个hashPasswordGenerator方法,他们能否反向工程我的密码?

不行。最坏的情况是它会指导他们进行暴力破解。

您的解决方案存在的问题在于它太容易被黑客攻击。

首先,显然缺乏盐值,这意味着如果两个用户使用相同的密码,则它们将具有相同的哈希值,这使得攻击多个帐户更容易。

其次,SHA256生成安全密码哈希值时速度太快了。您应该使用bcrypt或类似算法,以便可以控制轮数,从而使哈希生成“缓慢”。之所以希望它变慢,是因为您的应用程序一次只需要生成一个哈希值,因此如果计算上需要10000倍时间才能生成哈希值,那也没关系,但黑客需要生成数十亿个哈希值。所以,对于他来说,让这个过程变慢10000倍是一个巨大的问题。


非常感谢您的回答,我已经查看了建议添加迭代的PBKDF2。但是我仍然对盐有些困惑。如果用户可以获取密码,他们是否也能够获取盐呢? - user3284707
@user3284707 是的,但它会显著减缓暴力攻击的速度。 - Nasreddine
@user3284707 这篇维基百科文章详细介绍了如何(解释无法放在Stack Overflow评论中)。 - Nasreddine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接