我将用户登录加密密码存储在数据库(SQL Server)中。由于API限制,密码需要在C#端加密,因此我无法使用数据库的内置加密。什么是加密这些密码的最快/最简单的方法,以便我可以将它们与用户以后输入第三方服务的内容进行比较?
我是C#的新手,我知道密码永远不应该是纯文本,这就是为什么我要确保我拥有最高的安全性。我尝试过使用RSA.EncryptValue()
函数,但我对如何正确使用它感到很遗憾。
感谢任何帮助 - 提前感谢。
-Jimmy
答案 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
提供一些见解