繁体   English   中英

将密码存储到sql的最佳方法

[英]Best way to store password into sql

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

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

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

如果您所做的只是在数据库中存储密码,以便以后可以根据已知的输入值进行检查,那么使用salt的哈希将起作用。

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

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

我同意将加密全部放在一个位置是有意义的。 但是,如果将密钥与数据(c#代码中的密钥,数据库中的数据)分开,则可以提高安全性。 此外,Sql Server在加密时使用主密钥,这意味着如果需要将数据还原到新服务器,则无法恢复数据。

这一切都归结为密钥管理以及您希望如何做到这一点。

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

一些选择:

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

  2. 使用散列算法或某种形式的crypt()不可逆地“加密”密码。 根据可用的攻击向量,这种方法可能无法提供明显改进明文存储安全性的方法。

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

如果哈希被盗,则可以接受脱机字典攻击,如果密码对攻击者有任何价值,则应该直接假设恢复密码。

在某些情况下,密码哈希的知识可能与在系统访问方面知道密码一样糟糕。

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

否则,您必须存储加密密码,因为散列密码无法与涉及哈希的身份验证一起使用。 对于加密,我有以下建议,

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM