在我目前的C#windows应用程序中,密码以纯文本形式存储,这显然不太好。所以我只想知道加密密码并存储到SQL Server的最佳方法是什么。我已经读过使用hash + salt更好。但我觉得“EncryptByPassPhrase”,“DecryptByPassPhrase”在sql 2005中的新功能更好用,因为你正在处理SQL Server本身的所有内容,我想它使用三重DES。有人建议使用它是否好?
答案 0 :(得分:5)
您是否需要访问原始密码,或者您只是尝试将输入的密码与数据库中的密码进行比较?
如果您需要访问原始密码,那么您将不得不使用加密算法而不是哈希算法。
如果您所做的只是在数据库中存储密码,以便以后可以根据已知的输入值进行检查,那么使用salt的哈希就可以了。
请记住,当客户端发送凭证并进行验证时,您不希望以明文形式发送密码!
答案 1 :(得分:3)
哈希& salt是要走的路,因为它无法从中检索原始密码。如果你加密然后解密密码,明文密码是可以检索的,所以它不是最好的。
答案 2 :(得分:2)
我同意将加密全部放在一处是有意义的。但是,如果将密钥与数据(c#代码中的密钥,数据库中的数据)分开,则可以提高安全性。此外,Sql Server在加密时使用主密钥,这意味着如果您需要将数据恢复到新服务器,则无法恢复数据。
这一切都归结为密钥管理以及您希望如何做到这一点。
答案 3 :(得分:0)
与大多数问题一样,最佳答案取决于您的情况。没有好的解决方案。
一些选项:
保留密码为纯文本或可逆加密。使用SQLServer工具加密RDBMS级别的重要字段或使用类似的加密功能,并希望MS实施合理的密钥管理,并且密钥对于您的目的而言是相当安全的。在实践中,所有加密都是将大量小秘密存储到一个大秘密的存储中。它可能使问题更容易管理,但问题本身永远不会消失。
使用散列算法或某种形式的crypt()不可逆地“加密”密码。根据可用的攻击媒介,这种方法可能无法提供明确存储的安全性提升方式。
。在选择安全认证算法方面,使用散列密码会限制您的选择。使用这种方法,您可能最终会发送纯文本或其他材料,而这些材料在传输方面并不好(无论是否使用未绑定的加密),这可能是信任POV的重大风险。
。如果哈希被盗,则可以接受离线字典攻击,如果密码对攻击者有任何价值,则应该直接假设恢复部分密码。
。在某些情况下,密码哈希的知识可能与在系统访问方面知道密码一样糟糕。
答案 4 :(得分:0)
如果您确定永远不会使用散列方案进行身份验证(如HTTP Digest Auth),则散列密码更安全。为了避免彩虹表攻击,请使用nonce(或salt)。我会使用HMAC-SHA1并使用nonce作为密钥。它们必须与密码一起存储。
否则,您必须存储加密密码,因为散列密码无法与涉及哈希的身份验证一起使用。对于加密,我有以下建议,