【问题标题】:Best way to store password into sql将密码存储到sql中的最佳方法
【发布时间】:2009-08-12 05:36:24
【问题描述】:

在我当前的 C# windows 应用程序中,密码已以纯文本形式存储,这显然不好。所以我只想知道加密密码并存储到 SQL Server 中的最佳方法是什么。我读过使用哈希+盐更好。但我觉得 sql 2005 中的“EncryptByPassPhrase”、“DecryptByPassPhrase”新功能更好用,因为您正在处理 SQL Server 本身的所有内容,我想它使用三重 DES。有人可以建议使用它好吗?

【问题讨论】:

  • 非常感谢您的回复。我认为将 sha1 或 sha256 与盐一起使用会很好。只有 drwabck 是我无法解密它。但它仍然是有道理的。但我也开始知道 abt BCRYPT 对我来说看起来不错,但对于我的项目来说,使用 SHA 本身就足够了。如果有人想知道 abt bcrypt 然后 chk ths 链接-derekslager.com/blog/posts/2007/10/…

标签: c# sql-server-2005 passwords


【解决方案1】:

您需要访问原始密码,还是只是尝试将输入的密码与数据库中的密码进行比较?

如果您需要访问原始密码,那么您将不得不使用加密算法而不是哈希算法。

如果您所做的只是将密码存储在数据库中,以便稍后根据已知的输入值检查它,那么带有盐的散列将起作用。

请记住,当客户端发送凭据以进行验证时,您不希望以明文形式发送密码!

【讨论】:

  • 关于最后一段。你如何发送密码?您是否在客户端对其进行哈希处理并发送哈希?如果是这样,客户端不能看到使用的算法吗?
  • @miparnisari 他们是否知道所使用的散列算法并不重要——单向散列的要点是,在给定输出的情况下,很难找到输入。对抗rainbow tables 的帮助你应该使用盐(奖励积分:每个用户使用不同的盐),这样如果一个坏演员最终得到你的密码哈希的完整副本,他们将不得不计算一堆彩虹表来暴力破解你所有的密码。
【解决方案2】:

哈希和盐是要走的路,因为它不可能从中检索到原始密码。如果你加密然后解密密码,明文密码是可检索的,所以它不是最好的。

【讨论】:

    【解决方案3】:

    我同意将加密全部集中在一个地方是有意义的。但是,如果您将密钥与数据(c# 代码中的密钥、数据库中的数据)分开,这将提高安全性。另外,Sql Server 加密时使用主密钥,这意味着如果您需要将数据恢复到新的服务器上,您将无法恢复数据。

    这一切都归结为密钥管理以及您希望如何执行此操作。

    【讨论】:

      【解决方案4】:

      与大多数问题一样,最佳答案取决于您的具体情况。没有好的解决办法。

      一些选项:

      1. 将密码保留为纯文本或可逆加密。使用 SQLServer 工具在 RDBMS 级别加密重要字段或使用类似的加密功能,并希望 MS 已实施合理的密钥管理,并且密钥对于您的目的而言是合理安全的。实际上,所有加密所做的都是将一大堆小秘密的存储折叠成一个大秘密的存储。它可能使问题更易于管理,但问题本身永远不会消失。

      2. 使用散列算法或某种形式的 crypt() 不可逆转地“加密”密码。根据可用的攻击向量,此方法可能无法在实际提高纯文本存储安全性方面提供太多帮助。

      。使用散列密码限制了您在选择安全身份验证算法方面的选择。使用这种方法,您最终可能会发送纯文本或其他不比传输更好的材料(无论是否使用未绑定加密),这可能是信任 POV 带来的重大风险。

      。如果哈希值被盗,则容易受到离线字典攻击 如果密码的某些部分对攻击者有任何价值,则应完全假设它们的恢复。

      。在某些情况下,就系统访问而言,知道密码哈希可能与知道密码一样糟糕。

      【讨论】:

        【解决方案5】:

        如果您确定永远不会使用散列方案进行身份验证(如 HTTP Digest Auth),则散列密码更安全。为避免彩虹表攻击,请使用随机数(或盐)。我会使用 HMAC-SHA1 并使用 nonce 作为密钥。他们的密钥必须与密码一起存储。

        否则,您将不得不存储加密密码,因为散列密码无法用于涉及散列的身份验证。对于加密,我有以下建议,

        1. 不要将密钥存储在数据库中,也不要对其进行硬编码。将其存储在其他安全的地方,例如在 Windows 上使用 DPAPI。
        2. 确保您拥有密钥版本,以便您可以轮换密钥以符合特定标准。
        3. 我不熟悉 SQLServer 中的加密。确保它有一个随机的初始向量。您可以通过两次加密相同的密码来检查这一点,它应该产生不同的密文。如果没有随机 IV,请不要使用它,只需在您的应用程序中对其进行加密即可。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-01-18
          • 1970-01-01
          • 2012-09-13
          • 2010-12-08
          • 2016-09-24
          • 2020-08-10
          相关资源
          最近更新 更多