我将用户登录加密密码存储在数据库(SQL Server)中。由于API限制,密码需要在C#端加密,所以我不能使用数据库的内置加密。加密这些密码的最快/最简单方法是什么,以便我可以将它们与用户稍后输入第三方服务的内容进行比较?
我是 C# 新手,我知道密码永远不应该是纯文本,所以我想确保我拥有最高的安全性。我已经尝试过使用该RSA.EncryptValue()
功能,但我对如何正确使用它非常迷茫。
任何帮助表示赞赏 - 在此先感谢。
-吉米
我将用户登录加密密码存储在数据库(SQL Server)中。由于API限制,密码需要在C#端加密,所以我不能使用数据库的内置加密。加密这些密码的最快/最简单方法是什么,以便我可以将它们与用户稍后输入第三方服务的内容进行比较?
我是 C# 新手,我知道密码永远不应该是纯文本,所以我想确保我拥有最高的安全性。我已经尝试过使用该RSA.EncryptValue()
功能,但我对如何正确使用它非常迷茫。
任何帮助表示赞赏 - 在此先感谢。
-吉米
您不想加密和存储密码。你想生成一个哈希并存储它。然后,当用户登录时,您重新生成散列并将其与存储在数据库中的散列进行比较。
这个问题的答案提供了如何在 c# 中对密码进行散列的示例(一个答案包括有关进行“盐渍”散列的信息)。
首先不要加密;哈希。其次不要加密;哈希。
密码永远不可恢复。
我建议阅读... 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 .
就像史蒂夫韦伦斯提到的那样,生成一个哈希。希望这可以提供一些关于可用的不同的见解