【问题标题】:.NET 3.5 - Hashing a password using System.Cryptography.NET 3.5 - 使用 System.Cryptography 散列密码
【发布时间】:2011-03-07 03:27:16
【问题描述】:

我是安全细节方面的新手,尤其是密码学方面的新手。

在我们正在构建的应用程序(基于 .NET 3.5 的 ASP.net 应用程序)中,我们目前正在使用数据库来保存我们的用户身份验证信息(此时 AD 等不是一个选项)。 目的是在用户创建时使用 SHA256Managed 对密码进行单向加盐哈希,然后使用相同的方法验证用户。 理想情况下,我们不希望将任何第三方 dll 用于哈希算法,除非绝对必要以避免任何不必要的依赖。

问题:- 1. 有没有比单向加盐哈希更好的选择? 2. SHA256 是一个相当可靠/安全的选项还是我们应该考虑其他什么? 3. System.Cryptography 中的 SHA256Managed 实现在速度等方面是否足够好,还是我们应该考虑第三方替代方案?

任何有关方法/实现的指针都会有所帮助。

【问题讨论】:

    标签: security .net-3.5 encryption cryptography passwords


    【解决方案1】:

    我当天对此进行了一些研究,一致认为 BCrypt 是进行单向哈希的最佳方法之一。

    您可以在此处查看 C# 实现:http://derekslager.com/blog/posts/2007/10/bcrypt-dotnet-strong-password-hashing-for-dotnet-and-mono.ashx

    此外,BCrypt 的好处是你可以决定你希望它通过多少轮。

    因此,例如,您可以将加密时间设置为大约 1 秒。对于用户来说,这是可以接受的等待时间,但对于试图通过暴力攻击你的人来说,1 秒就是永恒。

    我不是安全专家,所以我在这里所说的只是一粒盐。您可以将盐发送到您的 BCrypt 方法:)

    此外,以下是 Atwood 的一些建议:http://www.codinghorror.com/blog/2007/09/youre-probably-storing-passwords-incorrectly.html

    更新

    自从回答这个问题后,NuGet 让 BCrypt 的使用变得更加容易:http://nuget.org/packages?q=bcrypt

    我不能保证那里有任何特定的实现,所以请看一下代码,但这应该会使 BCrypt 的使用和集成变得更加容易。

    【讨论】:

    • 感谢 CubanX,我一定会查找 BCrypt
    • 比 bcrypt 弱一点,但已经是 .net 框架的一部分:PBKDF2-SHA-1 使用Rfc2898DeriveBytes Class
    【解决方案2】:
    1. 是的,视网膜扫描(开玩笑的)。将密码存储为带盐的哈希值是正确的方法。
    2. SHA256 很好。显然我不知道您正在处理的应用程序的类型,但 SHA256 对绝大多数项目都有好处。如果需要,您始终可以使用更高的密钥长度(384、512)。请咨询您的安全架构师。
    3. SHA256Managed(我们说的是 .net,对吗?)很好。我们在项目中使用它。

    也请考虑阅读以下内容: http://www.obviex.com/samples/hash.aspx

    【讨论】:

    • 是的。它是我所指的.NET 实现。感谢您的链接。
    • 您好,由于倾向于使用内置算法作为 .NET 框架本身的一部分,我认为这可能是我现在要采用的选项。谢谢您的帮助。不过,是否使用 SHA256Managed / SHA512Managed 的​​决定尚未确定。
    • -1 声称 SHA-2 有利于密码散列。它太快了。请改用 PBKDF2、bcrypt 或 scrypt。
    • 嗯,我在 2.5 年前回答了这个问题。 SHA256 在当时被认为是好的。我同意需要明智地选择密码哈希算法,并且您的所有建议都是有效的(但微软需要做得更好,以使所有这些算法作为标准框架的一部分随时可供开发人员使用)
    【解决方案3】:

    是的,SHA256 没有任何问题,当然 SHA256Managed 对于大多数用例来说“足够快”(我敢肯定,您不会期望每秒验证 1000 次登录请求,即使您是,网站的其余部分仍然会使登录请求相形见绌...)

    但是您是否考虑过框架内置的 Membership 内容?他们已经完成了安全存储凭据以及实现所有支持功能(例如密码重置等)方面的所有艰苦工作

    【讨论】:

    • 其实..我听说过会员的东西,但还没有真正探索过。你的评论提醒我,我需要。谢谢! :-)
    【解决方案4】:

    用盐存储密码哈希是正确的。但是,即使是这么大的错误,也很容易出错。当然,现在 SHA256 将阻止坏人,但再过几年。突然之间,SHA256 似乎不再那么安全了。您需要使用BCrypt,这是一种面向未来的哈希算法。

    【讨论】:

      【解决方案5】:

      只执行一次 SHA256 的问题是它太快了,一个具有出色硬件的设备可以轻松生成大量盐的彩虹表...要解决这个问题,您需要执行密钥拉伸...。我是不会给你上一堂关于密钥拉伸的课,但是人们谈论的 bcrypt 实现会执行密钥拉伸。如果您想要在 .NET 中使用 HMACSHA256 或 512 的 bcrypt 的更现代替代方案,我推荐此 API:

      https://sourceforge.net/projects/pwdtknet/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-23
        • 1970-01-01
        • 2016-11-25
        • 2012-06-12
        • 1970-01-01
        • 2020-12-20
        • 1970-01-01
        • 2019-02-15
        相关资源
        最近更新 更多