我对密码学很陌生,想要了解哈希算法。
我有以下资源来创建一个密码的哈希版本,可以存储在我的数据库中。
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=
我的问题是:
- 这样安全吗?
- 我应该加盐吗?如果是这样,有人可以表明 我是一个简单的例子,因为我不太懂盐 生成,以便每次都匹配密码?
- 如果某人有这个hashPasswordGenerator方法,他们可以对我的密码进行反向工程吗?
醇>
提前致谢。
答案 0 :(得分:4)
这样安全吗?
如果你只是在没有盐的情况下使用SHA2,那不是真的。 (不是说SHA2可以轻易反转)
我应该加盐吗?
是
若有,有人可以给我一个简单的例子
public function render($request, Exception $e)
{
return response()->view('errors.custom');
}
因为我不太了解它生成的盐是如何每次都匹配密码
您必须保存盐(每个密码必须是唯一的)以及散列(密码+盐)。
如果某人有这种
RNGCryptoServiceProvider rngCsp = new RNGCryptoServiceProvider(); var salt = new byte[32]; rngCsp.GetBytes(salt); // this will fill the buffer with random values
方法,他们可以对我的密码进行反向工程吗?
是的,如果它是字典密码,如果你没有使用盐。否则(在可预见的将来),因为哈希应该很难逆转。
BTW而不是尝试重新发明轮子你应该考虑使用PBKDF2来进行密码哈希需求,因为它有一个工作因素可以减缓暴力攻击(迭代次数)。
答案 1 :(得分:2)
这安全吗?
是的,是的,不是。问题应该是"这对我的要求是否足够安全?",这是你能回答的问题。
我应该加盐吗?
是的,你应该。
如果某人有这个hashPasswordGenerator方法,他们可以对我的密码进行反向工程吗?
不,他们无法做到。在最坏的情况下,它会指向正确的强制方向。
您的解决方案存在的问题是它很容易被黑客入侵。
第一个问题显然是缺少一个盐值,这意味着如果2个用户拥有相同的密码,他们将拥有相同的哈希,这样可以更容易地破坏多个帐户。
其次,SHA256在制作安全密码哈希方面要快得多。你应该使用bcrypt或类似的,你可以控制轮数,以便生成哈希"慢"。你希望它变慢的原因是因为你的应用程序一次只需要生成一个哈希所以它没什么大不了的,如果计算它需要10000倍于生成一个哈希,而不是SHA256,但黑客需要生成数十亿的哈希。因此,对他来说这需要花费10000倍的时间才是最重要的。