【问题标题】:Recommended .NET encryption library [closed]推荐的 .NET 加密库 [关闭]
【发布时间】:2023-04-03 19:25:01
【问题描述】:

在阅读Jeff Atwood 的(又一个)post 或多或少得出结论认为我们凡人开发人员不应该过多地参与加密之后,我想知道我应该使用哪个库。我发现仅有的两个看起来合法的库是 entlib 和 Bouncy Castle,但对我来说,它们似乎并不比 .NET 加密 API 更抽象。

我想我想知道是否有一个“密码库的 jQuery”,它简单、广泛信任、开放和有据可查。

【问题讨论】:

  • System.Security.Cryptography 有什么问题?
  • @Thorarin - 这就是我一直在做的事情,但我认为有人会争辩不使用它的基本原因是因为该 API 中有很多选项,除非你了解所有内容,否则你最终会做错事。
  • 他在文章中提到的另一个是 Keyczar
  • @ChrisW 有 Java、Python 和 C++ 实现 code.google.com/p/keyczar
  • 这个问题需要针对不同的用例给出不同的答案——您是将数据传输给另一个人,还是只是在不使用数据时需要隐藏它。

标签: c# .net encryption


【解决方案1】:

编辑:这是来自https://github.com/quozd/awesome-dotnet/blob/master/README.md#cryptography的流行加密库的完整列表:

  • BouncyCastle - 连同 .Net System.Security.Cryptography,CLR 上加密算法的参考实现。
  • HashLib - HashLib 是您见过的几乎所有哈希算法的集合,它支持几乎所有内容并且非常易于使用
  • libsodium-net - libsodium for .NET - 一个安全的密码库
  • Pkcs11Interop - 非托管 PKCS#11 库的托管 .NET 包装器,提供对加密硬件的访问权限
  • StreamCryptor - 使用 libsodium 和 protobuf 进行流加密和解密
  • SecurityDriven.Inferno - .NET 加密库。经过专业审核。

原始答案如下。


Bouncy Castle 库确实是一个备受推崇且成熟的加密库,但是使用 .NET 框架中内置的许多出色的加密功能有什么问题?

System.Security.Cryptography Namespace

根据我的经验,这些实现是坚如磐石的,提供了许多选项(例如:您通常有一个 Crypto APICNG 和每个算法的托管实现可供选择),而您不是会“弄错”,因为您只是使用实现。如果您有点担心自己可能使用错误,您可以随时关注MSDN's own example code

【讨论】:

  • 我认为我链接到的文章(以及他们的前辈)提供了足够令人信服的理由来说明为什么我们大多数开发人员可能不应该对使用该命名空间过于着迷。所以我想这就是说我只是放弃听起来不错的建议。 codinghorror.com/blog/archives/001275.html
  • 您链接到一个示例 rijndael 实现,但这让我决定在所有不同的算法之间做出决定。我更喜欢一种抽象,它为我提供了 EncryptStringForBrowser() 之类的方法(Jeff 给出的示例),以便专家可以决定在后台使用 rijndael 或 aes。
  • @jayrdub - 我明白你对抽象的看法,但我认为不需要完整的完整层额外代码(根据像 BC 这样的第 3 方库)。你不想自己实现它有充分的理由,你不想“滥用”实现并削弱安全性。一切都很好,但我认为这可以通过框架的内置类和 MSDN 上的示例代码轻松实现。那里的示例提供了一个“encryptStringToBytes”风格的函数,使其在不削弱安全性的情况下用于字符串“不费吹灰之力”。
  • (续).. 至于选择哪种算法是您自己的责任,好吧,Rijndael 是高级加密标准,非常可靠,可以在 CryptoAPI/CNG/Managed 实现之间进行选择应该主要是速度、性能、CNG 库的可用性等问题,而不是安全性问题,因为它们都是相同的算法。关于一定程度的抽象,我同意你的看法,以防止我们凡人把它搞砸,但同时,太多抽象(在不知道完全的情况下使用某些东西> 它在做什么)可能是件坏事!
  • BouncyCastle 连文档都没有,不知道怎么下手。
【解决方案2】:

您完全误解了“不要自己实现加密例程”的格言。这意味着:不要推出自己的 RSA/DSA/任何加密算法。这并不意味着您不应该使用由知道自己在做什么的人编写的。事实上,如果有的话,在您和可信算法之间添加更多层会伤害您,而不是相反。

【讨论】:

  • 也表示“不要自己编算法”。 “我看不到我会如何打破它,所以我看不到其他人会如何”的方法不会给你安全感。
  • 我并不反对,我只是想了解是否有一些很棒的图书馆因为 Jeff 讨论试图避免的方式而错过了使用 .NET 的 API 支持“一套经过验证的、经过域专家测试的代码,成千上万甚至数百万的开发人员已经依赖这些代码”。我感觉没有(除了我提到的两个)。
【解决方案3】:

Bouncy Castle 似乎受到了广泛的尊重

【讨论】:

    【解决方案4】:

    EntLib Cryptography 块适用于大多数加密/散列需求。

    【讨论】:

      猜你喜欢
      • 2010-10-18
      • 2010-09-25
      • 2011-04-15
      • 1970-01-01
      • 1970-01-01
      • 2011-06-01
      • 2010-09-21
      • 2013-08-12
      • 2012-06-11
      相关资源
      最近更新 更多