在常规C#应用程序中,哪个类用于散列:xxxManaged
或xxx
(即SHA1Managed
vs SHA1
)以及为什么?
答案 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)