security - 盐是否需要随机才能保护密码哈希?

标签 security passwords rfc2898

我对安全性知之甚少(我需要找到基础知识的基本解释),并且正在尝试想出一种合理的方法来使用 .Net 在数据库中存储用户密码。

这是我当前的解决方案:

private static byte[] HashPassword(string password)
{
   using (var deriveBytes = new Rfc2898DeriveBytes(password, 10))
   {
      byte[] salt = deriveBytes.Salt;
      byte[] key  = deriveBytes.GetBytes(20);

      return salt.Concat(key).ToArray();  //Return Salt+Key
   }
}

我将 HashPassword() 的结果存储在数据库中。 要检查用户的密码,我这样做:

var salt = //1st  10 bytes stored in the DB
var key  = //Next 20 bytes stored in the DB 
using (var deriveBytes = new Rfc2898DeriveBytes(password, salt))
{
   byte[] newKey = deriveBytes.GetBytes(20);

   if (newKey.SequenceEqual(key) == false)  //Check if keys match
   {
      return "No Match";
   }
   else { return "Passwords match"; }

我的问题是盐是否需要是随机的并像这样存储在数据库中,或者我是否可以生成一个 10 字节盐并将其存储在我的代码中并始终使用相同的盐来保存自己将盐存储在DB 并只存储 key ?

此外,如果有人发现我正在做的事情有任何其他问题,我将不胜感激。

最佳答案

My question is if the salt needs to be random and stored in the DB like this or if I could generate a 10-byte salt and store it in my code and always use the same salt to save myself storing the salt in the DB and just store the key?

绝对不是。

如果你问这个问题,你根本就不明白盐的用途。

盐的目的是使攻击者更难以使用预先计算的哈希通用密码表。如果盐始终相同,那么攻击者只需使用该盐预先计算一个哈希通用密码表。

让我说得更清楚。假设攻击者已经获得了您的密码数据库,并正在闲暇时对所有存储的哈希值发起攻击,以找出与该哈希值相对应的密码。如果每个盐都不同,那么攻击者必须对数据库中的每个条目发起攻击。如果每个盐都相同,那么攻击一个用户就会攻击每个用户

此外:假设您为每个用户使用相同的盐。假设两个用户具有相同的密码。假设攻击者已经获得了密码数据库。 攻击者现在知道哪两个用户具有相同的密码,因为他们具有相同的加盐哈希,并且可以合理地假设这是数据库中最弱的密码。攻击者可以集中精力(无论是什么)来专门攻击该用户。一旦她知道该用户的密码,该用户很有可能在其他系统上使用过该用户名和弱密码,攻击者现在可以在不知道密码的情况下入侵这些系统文件。

您想了解安全性是件好事;以你的理解水平尝试编写一个真正的密码系统是很糟糕的。如果这是一个必须保护真实用户的真实系统,use a system built by experts ,或聘请自己的专家。您将创建一个无法破坏的系统,而不是一个攻击者无法破坏的系统。

此外:您在互联网上向陌生人寻求安全方面的帮助。陌生人,你不知道他们是否知道自己在说什么,或者只是在编造故事。 找一位真正的安全专家(那不是我——我是语义分析器方面的专家)。构建安全系统是最困难的编程任务之一;您需要专业帮助。

有关基本密码身份验证方案的简单介绍,请参阅我的系列文章:

http://blogs.msdn.com/b/ericlippert/archive/tags/salt/

关于security - 盐是否需要随机才能保护密码哈希?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9195692/

相关文章:

linux - 使用 Git 存储密码有多安全?

perl - 在 Perl 中创建 glibc 2.7 样式的 Sha-512 crypt 哈希

php - 使用 password_verify() 验证 MD5 密码

.net - PasswordDeriveBytes 与 Rfc2898DeriveBytes,已过时但速度更快

ruby-on-rails - 用于安全支付的最佳支付网关和 Rails gem?

php - 使用 $_GET

java - 检查密码/ key 代码是否匹配的方法

java - Java 中的 RFC2898DeriveBytes 实现

security - 不使用 .htaccess 文件是否存在安全风险?