C# - 存储用户密码以进行比较

时间:2012-04-19 20:58:17

标签: c# security password-protection

我将用户登录加密密码存储在数据库(SQL Server)中。由于API限制,密码需要在C#端加密,因此我无法使用数据库的内置加密。什么是加密这些密码的最快/最简单的方法,以便我可以将它们与用户以后输入第三方服务的内容进行比较?

我是C#的新手,我知道密码永远不应该是纯文本,这就是为什么我要确保我拥有最高的安全性。我尝试过使用RSA.EncryptValue()函数,但我对如何正确使用它感到很遗憾。

感谢任何帮助 - 提前感谢。

-Jimmy

3 个答案:

答案 0 :(得分:12)

您不想加密和存储密码。您想生成一个哈希并存储它。然后,当用户登录时,您将重新生成散列并将其与存储在数据库中的散列进行比较。

this question的答案提供了如何在c#中对密码进行散列的示例(一个答案包含有关执行“salted”哈希的信息)。

答案 1 :(得分:2)

首先不要加密;哈希值。 其次不要加密;散列。

密码永远不可恢复。

我建议阅读...... http://www.troyhunt.com/2010/05/owasp-top-10-for-net-developers-part-1.html 从前到后。

你应该使用一个体面的散列算法来填充你的密码和哈希;将SHA512作为低端,或者如果您认真保护这些数据,那么就会看到更多类似于BCrypt的内容http://code.google.com/p/bcryptnet/

散列而不是加密的重点不是保护您的网站免受暴力攻击,更重要的是保护您的用户免受数据丢失。

即。 http://www.bbc.co.uk/news/technology-11998648 - Gawker https://www.google.co.uk/search?sourceid=chrome&ie=UTF-8&q=sony+hacked

人们将分配信任放在Web开发人员手中,他们负责管理他们通常可怜的密码。好好照顾它们可能会产生很大的不同。

用BCrypt为腌制设定一个工作因素;我还要添加一个数据库salt(请参阅特洛伊搜索会员提供商关于MSFT如何做的文章)来增加原始密码值。

BCrypt站点的示例(BCrypt.net也是NUGET包)

 // Pass a logRounds parameter to GenerateSalt to explicitly specify the 
 // amount of resources required to check the password. The work factor  
 // increases exponentially, so each increment is twice as much work. If 
 // omitted, a default of 10 is used. 

 string hashed = BCrypt.HashPassword(password, BCrypt.GenerateSalt(12));

 // Check the password. 
 bool matches = BCrypt.CheckPassword(candidate, hashed);

希望这是有用的。

您当然可以使用内置表单身份验证加密系统来加密/解密您的数据。虽然它介于愚蠢和加密密码之间。

您还需要在web配置中添加machineKey标记,microsoft为此提供了一个生成器; http://aspnetresources.com/tools/machineKey该工具创建一个256位解密密钥和一个512位验证密钥,Rijndael作为数据验证算法。

如果你 DO NEED (如果你没有被拍摄)就开始投掷明文密码,对于所有神圣的人来说,检查服务是通过IP(IPSec)限制,亲爱的上帝,请使用SSL。

答案 2 :(得分:0)

就像Steve Wellens提到的那样生成哈希。 希望这能为不同的available

提供一些见解