【问题标题】:C# - Storing user password for comparisonC# - 存储用户密码以进行比较
【发布时间】:2012-05-01 11:23:30
【问题描述】:

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

我是 C# 新手,我知道密码永远不应该是纯文本,所以我想确保我拥有最高的安全性。我曾尝试使用 RSA.EncryptValue() 函数,但我对如何正确使用它感到很迷茫。

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

-吉米

【问题讨论】:

  • 最快/最简单/最高安全性。选择一个。
  • ken - 这对我不起作用,我需要将密码与第三方服务进行比较,所以我需要原始密码,让我重新表述问题。
  • @james 如果您需要原始密码来发送您需要解密的第三方。散列密码是一种方法,您无法获得原始密码。正如您在问题中所问的那样,您可以按照我的回答使用 rsa 加密和解密密码。
  • @NesimRazon 回答问题是一回事,鼓励不良做法是愚蠢的。我很想知道什么第三方真正认为可以以这种方式接受身份验证,而不是令牌交换或 OAUTH。

标签: c# security password-protection


【解决方案1】:

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

密码永远不可恢复。

我建议阅读... 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

人们将 allot 信任交给网络开发人员来处理他们的(通常是可悲的)密码。好好照顾它们可以带来很大的不同。

使用 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。

【讨论】:

  • 我喜欢对 nuget 的引用和一个易于使用的包。简化流程。
【解决方案2】:

就像 Steve Wellens 提到的那样,生成一个哈希。 希望这可以对不同的available

提供一些见解

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 实际上,我确实想加密并存储密码!如果我想对密码进行哈希处理,我会问这个
    • 如果您存储密码(加密与否),您将无法获得最高安全性。 “密码”的比较应始终使用哈希进行。
    • 你说得对,我应该散列 - 适合我阅读毫无价值的文档
    猜你喜欢
    • 2021-10-23
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多