您也可以通过以下任一方式创建MD5CryptoServiceProvider对象:
(MD5CryptoServiceProvider) HashAlgorithm.Create("MD5");
(MD5CryptoServiceProvider) HashAlgorithm.Create("System.Security.Cryptography.MD5");
由于MD5是标准算法,而不是它们的代码相同,因此所有MD5类返回相同的哈希值。
但是创建MD5CryptoServiceProvider对象的方式并不是唯一的选择。
运行Windows的美国政府计算机必须启用FIPS模式。该模式确保使用的加密代码经过NIST验证。
各种.NET加密类通常存在多个版本。其中一个版本使用纯.NET代码,而其他版本调用Win32 API加密函数。
各种Win32加密API如下:
- Windows NT 4加密API:CAPI(CryptoAPI)。我理解CSP(Cryptographic Service Provider)是在CryptoAPI之上的加密API。
- Windows Vista加密API:CNG(Cryptography Next Generation)
Microsoft表示,加密服务提供程序已弃用,并可能在未来的Windows版本中被删除,并称CNG是CryptoAPI的长期替代品。
.NET加密类名称通常具有以下后缀:
- "
CryptoServiceProvider"表示调用CryptoAPI Win32 API的类。
- "
Cng"表示调用CNG Win32 API的类。
- "
Managed"表示纯.NET代码类。
某些Win32 API可能无法符合FIPS标准,而且出于未公开的原因,微软没有请求或无法获得加密.NET纯代码的FIPS验证。
不符合FIPS标准的类会在启用FIPS模式的计算机上引发CryptographicException。这在它们的文档中提到。
因此,如果您的程序不打算在美国政府电脑上运行,则可以自由使用最快的类。
关于MD5,正如类名所示,MD5CryptoServiceProvider类应调用即将过时的CryptoAPI,并符合FIPS标准,而MD5Cng类调用CNG API并不符合FIPS标准。这表明,在未来的Windows版本中,MD5可能无法在美国政府计算机上使用。实际上,MD5.NET类的文档建议将MD5替换为SHA256或SHA512。
有关微软关于FIPS的含糊立场的更多信息,请参见:
https://blogs.technet.microsoft.com/secguide/2014/04/07/why-were-not-recommending-fips-mode-anymore/
MD5CryptoServiceProvider是从.NET Framework 1.1版本开始存在的。在Windows XP时期,MD5CryptoServiceProvider类被添加进来了。当时底层的Win32 CNG API并不存在。因此,MD5.Create方法在算法选择上没有选择余地,而微软可能还没有计划在Windows上实现CNG。自CNG被添加到Vista后,MD5Cng才存在于.NET Framework 3.5中。
与MD5CryptoServiceProvider相比,以下是大致执行时间(时间越短越好):
MD5Cng: x 1.08(.NET Framework 3.5)
SHA256CryptoServiceProvider: x 2.5(.NET Framework 3.5)
SHA256Cng: x 2.4(.NET Framework 3.5)
SHA256Managed: x 4.8(.NET Framework 1.1)
这些意外的结果显示,SHA256Managed .NET纯代码实现速度较慢。
当SHA256Managed实现时,表现更好的Windows Vista CNG并不存在。
在流上执行要比在字节数组上执行总是略快一些。
用于验证本帖是否被外部代理修改的哈希值为:
1c84TiredWithMSDNwrittenByAncientEgyptians4cfebef40b0ae0a906b97c7