【问题标题】:.net implementation of bcryptbcrypt 的 .net 实现
【发布时间】:2010-10-26 18:46:03
【问题描述】:

有谁知道 bcrypt 的一个很好的实现,我知道这个问题之前已经被问过,但它得到的回应很少。我有点不确定是否只是选择在谷歌中出现的实现,并且我认为在 System.Security.Cryptography 命名空间中使用 sha256 可能会更好,至少我知道它是受支持的!你有什么想法?

【问题讨论】:

    标签: .net bcrypt bcrypt.net


    【解决方案1】:

    听起来你在找BCrypt.net

    BCrypt.net 是一个实现 OpenBSD 的基于 Blowfish 的密码 哈希码,在“A 未来适应密码方案” by Niels Provos 和 David Mazières。它是 Damien 的 jBCrypt 的直接端口 米勒,因此被释放 相同的 BSD 风格的许可证。代码是 完全托管,应与任何 little-endian CLI 实现——它 已通过 Microsoft .NET 测试 和单声道。

    【讨论】:

    • 是的,这也是我在 Google 上找到的。你用过吗,或者你知道它是否被广泛使用?
    • 我之所以考虑使用 BCrypt 是因为这篇文章 matasano.com/log/958/… 并声称 BCrypt 是要走的路。
    • 只是想补充一点,如果您在 Windows Server 2008 上使用 BCrypt.net,您需要将其命名为 BCrypt.dll 以外的名称,否则它将与 Vista 中的新 Windows API 冲突调用“bcrypt.dll”中的函数,因此如果您的 Web 应用程序 bin/ 目录中有 Bcrypt.net 作为 Bcrypt.dll,Windows 将无法找到正确的 dll,您将得到一些神秘错误。跨度>
    • 注意:为什么要使用 bCrypt 的以下原因(对于那些感兴趣的人)。 codahale.com/how-to-safely-store-a-password
    • 文章已移动:chargen.matasano.com/chargen/2007/9/7/enough-with-the-rainbow- tables-what-you-need-to-know-about-s.html
    【解决方案2】:

    您可以在此处找到适用于 .Net 的 BCrypt 的更新实现: http://bcrypt.codeplex.com/

    【讨论】:

      【解决方案3】:

      在将某些内容从 PostgreSQL(有 pg_crypto)移动到 SQLite(没有)时,我需要一个 BCrypt 实现,所以我自己编写了一个。从这条消息中看到,我不是唯一需要这个的人,我决定在它上面贴一张许可证并发布它。网址是:

      http://zer7.com/software.php?page=cryptsharp

      它背后的 Blowfish 实现是 Bruce Schneier 的公共域 C 实现的一个端口,并且在所有官方测试向量上都取得了成功。

      我根据规范自己编写的 BCrypt 代码。我还创建了一个 PHP 脚本,它生成长度为 0 到 100 的随机密码和盐,加密它们,并将它们输出到测试文件。到目前为止,C# 代码匹配这些 100% 的时间。欢迎您使用该脚本并自行测试。

      该库还包括适用于任何 HMAC 的 PBKDF2 代码,而不是 .Net 的仅 SHA-1 实现(今天添加——我打算很快在 C# 中执行 SCrypt,这需要带有 HMAC-SHA256 的 PBKDF2)。如果你愿意,你也可以在此基础上为自己制定一个方案。

      【讨论】:

        【解决方案4】:

        BCrypt.Net 似乎是目前最流行的库

        http://bcrypt.codeplex.com/

        这是一个如何使用它来哈希密码的示例:

        [TestMethod]
            public void BCryptTest()
            {
                const string password = "PASSWORD";
                const int workFactor = 13;
        
                var start = DateTime.UtcNow;
                var hashed = BCrypt.Net.BCrypt.HashPassword(password, workFactor);
                var end = DateTime.UtcNow;
        
                Console.WriteLine("hash length is {0} chars", hashed.Length);
                Console.WriteLine("Processing time is {0} with workFactor {1}", end - start, workFactor);
                Console.WriteLine("Hashed password: {0} ", hashed);
                Console.WriteLine("correct password {0}", BCrypt.Net.BCrypt.Verify("PASSWORD", hashed));
                Console.WriteLine("incorrect password {0}", BCrypt.Net.BCrypt.Verify("PASSWORd", hashed));
            }
        

        样本输出:

        hash length is 60 chars
        Processing time is 00:00:01.0020000 with workFactor 13
        Hashed password: $2a$13$iBqdG7ENBABEargiyzGlTexPsmviF/qrFxUZB2zce7HKF6MoBNhEq 
        correct password True
        incorrect password False
        

        【讨论】:

          【解决方案5】:

          你试过这个MS BCryptCreateHash C++ function吗?似乎存在于 Windows Server 2008 和 Windows Vista 中。

          另外,你也许也可以检查以下MS C# BCryptNative.cs 类。

          【讨论】:

          【解决方案6】:

          错误答案,请看下文

          .Net 框架中的所有“Cng”(下一代密码学)后缀算法现在都使用 bcrypt。例如。 SHA256Cng.


          实际上,MS BCrypt (BestCrypt) 并不是指基于 Blowfish 密码的那个 - 谢谢 RobbyD 的评论。
          不会删除答案,以防其他人产生同样的困惑。

          【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-11-20
          • 2021-01-11
          • 2014-06-16
          • 1970-01-01
          • 1970-01-01
          • 2012-01-02
          • 1970-01-01
          相关资源
          最近更新 更多