2016-05-28 302 views
4

我对密码学相当陌生,并且想要让我的头部围绕哈希算法。散列算法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); 
    } 

我的例子用户User1与密码Password1,这将返回的GVE/3J2k+3KkoF62aRdUjTyQ/5TVQZ4fI2PuqJ3+4d0=

我的问题哈希版本是:

  1. 这是安全的?
  2. 我应该为此添加盐吗?如果是的话,有人可以显示我 一个简单的例子,因为我真的不明白它是如何生成的,以便它每次都能匹配密码?
  3. 如果有人有这个hashPasswordGenerator方法可以逆向工程我的密码?

在此先感谢。

+0

在你的例子'StringBuilder hash = new StringBuilder();'从不使用。 – Ashigore

+0

[SHA-1安全用于密码存储?](http://stackoverflow.com/questions/2772014/is-sha-1-secure-for-password-storage)(SHA-256和SHA-1没有根本的区别) –

+0

你不应该使用简单的散列函数来散列密码。您需要使用像PBKDF2,bcrypt,scrypt和Argon2这样的特意缓慢的散列函数。查看更多:[如何安全地哈希密码?](http://security.stackexchange.com/q/211/45523) –

回答

4

这种产品是否安全?

不是真的,如果你只是没有盐使用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(散列)'所以这是一个管道分隔字符串? – user3284707

+0

您可以将其存储在单独的字段中,因为无需解析字符串就可以更容易地读回。 – Nasreddine

+0

因此,在密码被加密前,这个盐值被添加到密码中,这意味着相同的两个密码永远不会相同的哈希值?所以要检查密码时,我查找盐,添加明文密码,然后散列并查看它们是否匹配? – user3284707

2

这种产品是否安全?

是的,不,不是。问题应该是“这对我的要求是否足够安全?”,这是你只能回答的问题。

我应该为此添加盐吗?

是的,你应该。

如果有人有这个hashPasswordGenerator方法,他们可以逆向工程我的密码?

不,他们不能。在最坏的情况下,它会将他们指向正确的方向来强制蛮力。

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

第一个问题显然是缺少盐值,这意味着如果2个用户具有相同的密码,他们将具有相同的散列,这使得更容易危害多个帐户。其次,SHA256太快了,无法做出安全的密码散列。您应该使用bcrypt或类似的方法控制轮次数,以使散列生成“缓慢”。你希望它变慢的原因是因为你的应用程序只需要一次生成一个散列,所以如果计算上来说它没有什么大不了的,但它产生一个has的时间比SHA256多10000倍,但是黑客需要产生数十亿的散列。因此,为他做这个需要长达10000倍的时间是一笔巨大的交易。

+0

非常感谢您的回答,我按照建议添加了迭代,查看了PBKDF2。尽管我仍然对盐感到困惑。如果用户能够获得密码,他们也不能掌握盐? – user3284707

+0

@ user3284707是的,但它会大大减缓蛮力攻击。 – Nasreddine

+0

@ user3284707这个维基百科文章有关于[how](https://en.wikipedia.org/wiki/Salt_(cryptography))的更多细节(解释不适合堆栈溢出注释)。 – Nasreddine

相关问题