使用哪一个:托管与非托管哈希算法
在常规的C#应用程序中,哪个类用于散列: xxxManaged
或xxx
(即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级的命令!