【问题标题】:What is the best way to store user passwords in a database?将用户密码存储在数据库中的最佳方法是什么?
【发布时间】:2017-08-02 23:59:36
【问题描述】:

我正在设计一个数据库,我计划将用户密码存储在数据库中。我想知道将用户密码存储在数据库中的最佳方法是什么?

【问题讨论】:

  • 仅使用散列函数是不够的,仅添加盐对提高安全性无济于事。相反,iIterate over an HMAC with a random salt for about 100ms duration and save the salt with the hash.使用PBKDF2Rfc2898DeriveBytespassword_hashBcrypt等函数和类似函数。关键是让攻击者花费大量时间通过蛮力寻找密码。

标签: database passwords


【解决方案1】:

因此,我们可以做以下事情:

不要发明自己的巧妙密码存储方案。

与您的应用程序中的功能错误不同,安全漏洞会深入且无声地运行。

它们可以休眠多年。

切勿将密码存储为纯文本。

这感觉就像安全 101,而且非常明显。

存储哈希值,而不是实际密码。教育您的开发人员。

为您存储的每个密码添加一个长且唯一的随机盐。

这将使您免受彩虹桌攻击。

使用加密安全哈希。 SHA-2 或 Bcrypt 是比 MD-5 更好的选择。

【讨论】:

  • SHA-2 和 Bcrypt 是两种非常不同的密码哈希方法,SHA-2 本质上不提供安全性,而 Bcrypt 是一种安全的迭代方法。将这两种方法等同于本质上等效的密码安全性不仅是错误的,而且可能会误导您,从而导致密码安全性可以忽略不计。
  • SHA-2 比 MD5 安全得多。
  • @zaph 只是想知道,什么是密码哈希方法?将密码存储在数据库中需要做什么?
  • 密码哈希方法是使用更多资源、时间和/或内存来减缓攻击者的函数。当前硬件上的 MD5、Shared* 等仅花费大约 1 微秒,密码散列函数通常需要大约 100 毫秒,100,000 多的时间,所以即使使用经常使用的密码列表,暴力破解也变得非常耗时,这就是我们对典型硬件的最佳保护。
  • 方法的命名方式存在混淆。 Bcrypt 不是加密,而是一种在内部使用加密函数的安全散列密码的迭代方法。 password_hash 内部一般使用Bcrypt。另一种方法是PBKDF2(基于密码的密钥派生方法),也称为Rfc2898DeriveBytes。开发人员只是通过糟糕和不一致的命名来帮助制造他们自己的混乱。所以我使用短语密码散列函数来区分这些与原始密码散列函数,如 MD5 和 SHA*。
猜你喜欢
  • 1970-01-01
  • 2012-09-13
  • 2020-08-10
  • 1970-01-01
  • 2013-11-24
相关资源
最近更新 更多