C# 推荐的.NET加密库

C# 推荐的.NET加密库,c#,.net,encryption,C#,.net,Encryption,在阅读了(另一篇)关于我们普通的开发人员不应该过度参与加密的结论后,我开始思考我应该使用什么库。我发现唯一两个看起来合法的库是entlib的和,但在我看来,它们并不像.NET加密API那样是一种抽象 我想我想知道的是,是否有一个简单、广受信任、开放且有良好文档记录的“jQuery密码库”。似乎受到了广泛的尊重 -与.Net System.Security.Cryptography一起,是CLR上加密算法的参考实现 -HashLib是您见过的几乎所有哈希算法的集合,它几乎支持所有内容,并且非常易

在阅读了(另一篇)关于我们普通的开发人员不应该过度参与加密的结论后,我开始思考我应该使用什么库。我发现唯一两个看起来合法的库是entlib的和,但在我看来,它们并不像.NET加密API那样是一种抽象


我想我想知道的是,是否有一个简单、广受信任、开放且有良好文档记录的“jQuery密码库”。

似乎受到了广泛的尊重

  • -与.Net System.Security.Cryptography一起,是CLR上加密算法的参考实现
  • -HashLib是您见过的几乎所有哈希算法的集合,它几乎支持所有内容,并且非常易于使用
  • -libnail for.NET-一个安全的加密库
  • -非托管PKCS#11库的托管.NET包装器,提供对加密硬件的访问
  • -使用libnaude和protobuf进行流加密和解密
  • -.NET加密库。专业审计
原来的答案如下


Bouncy Castle库确实是一个备受尊敬的成熟加密库,但是使用许多内置在.NET framework中的奇妙加密函数有什么不对呢


根据我的经验,这些实现是坚如磐石的,提供了许多选项(例如:您通常有一个可供选择的、可管理的每个算法的实现),而且您不会“弄错”,因为您只使用实现。如果您有点担心可能会错误地使用它们,您可以始终遵循。

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

EntLib加密块对于大多数加密/哈希需求都很有效。

System.Security.Cryptography?@Thorarin-这就是我一直在做的事情,但我认为有人会争论不使用它的基本原因是,API中有太多的选项,除非你理解所有东西,否则你最终会做错事。他在文章中提到的另一个原因是Keyczar@ChrisW那个有Java,Python,和C++实现,这个问题对不同的用例有不同的答案——你是把数据传送给另一个人,还是你不需要使用它时就隐藏它?我想这篇文章(以及他们的前辈)我的链接给出了足够令人信服的理由,说明为什么我们大多数开发人员可能不应该过于沉迷于使用该名称空间。所以,我想这就是我要说的,我只是想放弃那些听起来不错的建议。您链接到一个示例rijndael实现,但这让我决定在所有不同的算法之间做出选择。我更喜欢提供EncryptStringForBrowser()等方法的抽象(Jeff给出的一个示例),这样专家就可以决定在幕后使用rijndael或aes。@jayrdub-我明白你对抽象的看法,但我认为没有必要提供完整的额外代码层(根据像BC这样的第三方库)。您不希望自己有充分的理由来实现它,也不希望“误用”实现并削弱安全性。所有这些都很好,但我认为这可以通过框架的内置类和MSDN上的示例代码轻松实现。这里的示例给出了一个“encryptStringToBytes”样式的函数,它使在不削弱安全性的情况下对字符串使用它成为一个“无需大脑的”功能。。至于自己决定选择哪种算法的责任,Rijndael是高级加密标准,而且非常可靠,在CryptoAPI/CNG/托管实现之间进行选择应该在很大程度上取决于速度、性能,CNG libs等的可用性,而不是安全性,因为它们都是相同的算法。我同意你关于某种程度的抽象以防止我们这些凡人把事情搞砸的观点,但同时,太多的抽象(使用一些根本不知道它在做什么的东西)可能是一件坏事!BouncyCastle甚至没有文档,我不知道如何开始。它还意味着“不要自行制定算法”。“我看不出我会如何破坏它,所以我看不到其他人会如何破坏它”的方法并不能给你带来安全感。我并不反对,我只是想弄清楚是否有一些很棒的库,我错过了,因为Jeff讨论了如何避免使用.NET的API来支持它“一套经过验证的、领域专家测试过的代码,即使不是数百万的开发人员,也是成千上万的开发人员已经依赖的。”我感觉没有(除了我提到的两个)。