1

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

我是 C# 新手,我知道密码永远不应该是纯文本,所以我想确保我拥有最高的安全性。我已经尝试过使用该RSA.EncryptValue()功能,但我对如何正确使用它非常迷茫。

任何帮助表示赞赏 - 在此先感谢。

-吉米

4

3 回答 3

12

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

这个问题的答案提供了如何在 c# 中对密码进行散列的示例(一个答案包括有关进行“盐渍”散列的信息)。

于 2012-04-19T21:03:51.047 回答
3

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

密码永远不可恢复。

我建议阅读... 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,您可以为加盐设置一个工作因数;我还将添加一个数据库盐(请参阅 troy hunt 会员提供者文章,了解 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);

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

希望那是有用的。

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

你还需要在你的网络配置中添加一个 machineKey 标签,微软为此提供了一个生成器;http://aspnetresources.com/tools/machineKey 该工具创建一个 256 位解密密钥和一个 512 位验证密钥,使用 Rijndael 作为数据验证算法。

而且,如果您确实需要(因为如果您不这样做,您将被枪杀)开始到处乱扔明文密码,尽管如此,请检查该服务是否受 IP(IPSec)限制,亲爱的上帝,请使用 SSL .

于 2012-04-19T21:10:43.913 回答
0

就像史蒂夫韦伦斯提到的那样,生成一个哈希。希望这可以提供一些关于可用的不同的见解

于 2012-04-19T21:09:46.720 回答