使用哪一个:托管与非托管哈希算法

在常规的C#应用​​程序中,哪个类用于散列: xxxManagedxxx (即SHA1Managed vs SHA1 )以及为什么?

***Cng结尾的非托管哈希值,即SHA256Cng ,也将具有平台限制。 它们比托管备选方案快得多,但在Windows XP上运行时会失败,例如。 但是,如果您知道您的程序将始终在Windows 7,Vista SP1或2008上运行,那么它们通常会比托管版本执行得更好,即使使用本机互操作开销也是如此。

如果您正在编写通用程序, ***Managed类将更容易使用,因为它们将始终有效。

您应该使用*Managed变体; 他们通常更快。

*CryptoProvider*CNG类使用本机互操作,通常较慢。
但是,我听说他们可以使用硬件加密加速器。 (我没有检查过)

此外,本机版本已通过FIPS认证; 托管版本不是。

*托管版本使用完全托管代码编写,* Provider版本是API的包装。 因此,如果您始终使用托管版本,您的代码将是可移植的,例如Mono,但如果您使用Provider版本,您将仅限于Windows平台。

托管库使用起来更安全,不会产生PInvoke开销。 此外,对于长时间运行的应用程序(ASP.NET),内存泄漏可能会累积以降低服务器,因此托管也是可取的。

托管类通常在.NET中使用“更安全”; 它们实现了框架定义的接口,如IDisposable和ICryptoServiceProvider。 但是,由于托管组件,它们有点慢。 如果需要随意创建和销毁这些帮助程序,和/或如果需要实现基于接口的设计模式,则应使用托管类。

非托管类通常更快(因为它们被预编译为机器代码),但可能难以使用。 销毁非托管类的实例可能会有问题,有时甚至是不可能的。 如果没有托管包装器可以执行相同的操作,您应该使用这些(因为您最终可能会为非托管类实现自己的包装器以处理实例化,互操作和销毁),或者如果使用的是-off。

Managed和CNG非托管版本之间的另一个区别是支持的.Net Framework版本:例如

  • AES管理版本从3.5开始,而CNG从4.6.2开始
  • SHA512, Managed从1.1开始, Cng从3.5开始。

但是,我相信如果我们不受框架版本的限制或支持传统操作系统版本,我们应该使用CNG版本

  • 后缀为Cng的散列算法是唯一使用bcrypt的算法
  • 它可能需要更长时间的事实实际上是一个优势,因为它可以防止暴力攻击:在用户端300ms或3ms没有区别,而对于攻击者来说它是100级的命令!