哈希算法 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=
的散列版本
我的问题是:
- Is this secure?
- 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?
- 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 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 倍的时间是一件大事。
我对密码学还很陌生,想了解哈希算法。
我有以下来源来创建密码的散列版本,可以将其存储在我的数据库中。
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=
我的问题是:
- Is this secure?
- 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?
- 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 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 倍的时间是一件大事。