【问题标题】:What is the best way to encrypt a password?加密密码的最佳方法是什么?
【发布时间】:2011-05-20 04:28:07
【问题描述】:

我即将为我的应用程序创建一个“登录”,并且想知道为我的用户加密我将在我的数据库中输入的密码的最佳方法是什么?我在谷歌上找到了很多方法,但不知道哪个是最好的。

【问题讨论】:

  • 您需要“加密”密码还是“散列”密码?这不一样。散列更安全,但如果你需要有一天能够阅读它们,那么加密是要走的路。下面的大多数答案都假设您需要哈希。你能澄清一下吗:)?
  • 我想要哈希。更安全:)

标签: c# encryption hash password-protection


【解决方案1】:

我会选择一种方式salted hash

例如,使用 SHA1 哈希,您可以将密码存储为无法还原为原始密码的哈希。然后,当用户输入他/她的密码时,您对密码执行相同的 SHA1 哈希,并将该哈希与您存储在数据库中的内容进行比较,如果它们匹配,则密码是正确的。

为了进一步保护散列,您可以添加盐,这本质上是您为每个用户生成的随机生成的值,然后您创建帐户,并将盐值存储在用户记录中。当您创建密码的哈希值时,您首先将密码与盐结合起来,并对这个组合值进行哈希处理。要对用户进行身份验证,您可以将输入的密码与为用户存储的盐结合起来,对组合值执行散列并进行比较。

通过将盐添加到混合中,您可以确保恰好相同的密码的哈希具有不同的哈希,因为加盐的部分不同。因此,如果两个用户的密码相同“Password1234”,则存储的两个用户的哈希值将不相同,因此无法确定两个用户的密码相同。

【讨论】:

  • +1,但我不建议使用 SHA1。我推荐河豚/双鱼或 SHA-2。见:stackoverflow.com/questions/1561174/…
  • 钱包 SHA1/SHA2 不是最佳选择,因为它速度快,因此更容易受到暴力破解。所以使用好的 KDF 会更好。
  • 这是一个很好的起点obviex.com/samples/EncryptionWithSalt.aspx
  • salted 哈希都很好,但它们不能防止暴力攻击 - SHA 很快。如今,您可以租用使用 GPGPU 构建的密码破解集群的访问权限,而这些集群在暴力破解方面快速
【解决方案2】:

我推荐使用Rfc2898DeriveBytes

它使用良好的标准化 Key-Derivation-Function 和现代哈希。除了密码之外,您还需要传入盐以防止彩虹表。它为你混合了盐和密码,所以你不需要自己弄清楚如何去做。

【讨论】:

  • RFC2898 也称为 PBKDF2。
【解决方案3】:

使用 bcrypt。不,真的,放弃任何关于构建自己的方法的想法,以及use bcrypt。世界上已经有足够多的自制不安全密码哈希方案了。

当然,使用每个用户的盐来存储加盐密码哈希,一切都很好。但是加盐只能防止彩虹表攻击,它不能防止暴力破解。因此,自相矛盾的是,您不想使用快速方法来生成或验证密码哈希。 MD5、SHA 等等——它们都很快。跟着我重复:使用 bcrypt。

【讨论】:

  • Bcrypt 和 PBKDF2(又名 RFC2898)都是很好的 KDF。但是使用真正的 KDF!
【解决方案4】:

【讨论】:

    【解决方案5】:

    使用.net框架提供的密码学算法

    通常,许多应用程序使用 MD5 算法

    See here

    【讨论】:

    • 除非您绝对需要更小的密钥大小或速度,否则真的没有理由在新应用程序中使用 MD5。
    • 除了向后兼容外,没有理由使用 MD5。对于新代码,我更喜欢 SHA-1 或 SHA-2
    • 绝对是 SHA-2。 .NET Framework 提供 SHA256 和 SHA512 作为 System.Security.Cryptography 命名空间中的内置函数。
    • 请对答案投反对票,以便我能学到有用的东西
    猜你喜欢
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    • 2010-09-10
    • 2011-07-16
    • 2010-09-13
    • 2012-08-15
    相关资源
    最近更新 更多