【问题标题】:How to store passwords in a database table如何将密码存储在数据库表中
【发布时间】:2012-03-16 12:26:45
【问题描述】:

我正在设计一个 C# 应用程序,我需要在其中将用户的登录信息(包括他们的密码)存储在数据库表中。我想知道这样做的好方法是什么。

我知道将密码存储为明文是一个糟糕的主意。

我正在考虑加密密码然后存储它们。之后,每次用户输入密码时,我都可以加密他们的输入,并将加密的输入与数据库中已有的输入进行比较。我的计划是使用一个好的has函数进行加密......

【问题讨论】:

  • 请注意,重复中的前几个答案不涉及迭代哈希:这非常重要,因为使用单个哈希迭代仍然很容易暴力破解字母数字密码,即使它们是加盐的.
  • @Cameron。对于任何现代算法,我都不会说暴力破解单个迭代的加盐哈希是“容易的”。无论如何,它的 this q&a 是重复的。如果您觉得需要澄清,您可能希望将您的答案重新发布到原始线程中。

标签: c# database encryption passwords store


【解决方案1】:

我认为一种常见的策略是使用 SHA-256 之类的方法对密码进行哈希处理并将其存储在数据库中。然后登录时,对用户输入的任何内容进行哈希处理,并将其与数据库中的内容进行比较。

这个系统意味着你的“加密”是一种方式。给定密码哈希,您无法检索密码。请注意,这会产生可用性后果。具体来说,您不能向用户发送他们的密码。您只能重置密码。

进一步的改进是在对密码进行哈希处理之前对密码进行salt。这可以防止涉及彩虹表的一类攻击。您几乎可以肯定地这样做以及对密码进行哈希处理。

正如其他人所说,重复多次以防止暴力攻击也很重要。

【讨论】:

  • 哈希+盐+迭代。存储原始哈希是不安全的。
  • 是的,我修改了答案以反映这一点。
  • + 迭代。这很重要,大多数人忘记了这样做。这就是我们使用 bcrypt 或 pbkdf2 的原因:它们是由加密人设计的,而且做得很好。
  • 迭代几次,是的,其中“几个”通常是数千到数十万的数量级。迭代 10 次对于 SHA2 来说毫无意义,因为它的速度非常快。
【解决方案2】:

永远不要存储密码。存储密码的哈希值。

请注意,这不是加密。散列和加密是相关的,但它们并不相同。

您可以做的最好的事情是使用标准密码散列函数,例如 bcrypt 或 pbkdf2。不要重新发明轮子。

This article 对如何安全地存储密码有很好的描述。

【讨论】:

    猜你喜欢
    • 2011-02-27
    • 2016-12-25
    • 2011-07-15
    • 2012-11-25
    • 2016-01-15
    • 1970-01-01
    • 2022-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多