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

时间:2011-03-17 16:12:59

标签: c# unmanaged hash managed

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

6 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分:7)

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

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

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

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

但是,我认为,如果我们不受框架版本的限制或不支持旧版OS版本,则应使用 CNG版本

  • 使用Cng后缀的哈希算法是唯一使用 bcrypt
  • 的算法
  • 可能花费更长的时间实际上是一个优势,因为它可以防止暴力攻击:在用户端300ms或3ms没什么区别,而对于攻击者来说,这是100量级!