为什么SHA256的所有变体都显示为SHA256Managed?

时间:2013-11-22 10:41:12

标签: c# hash md5 checksum sha256

我正在编写一种扩展方法,通过删除大量样板来简化哈希的创建,但我的问题是每当我单步执行代码时,我都会看到始终选择{ {1}},无论我是否致电SHA256ManagedSHA256.Create()SHA256Cng.Create()SHA256Managed.Create()

当我选择不同的哈希算法(如MD5)时,情况也是如此,但在MD5的情况下,总是选择SHA256CryptoServiceProvider.Create(),无论我实际使用哪个类......

为什么?

这是我的代码:

MD5CryptoServiceProvider

那么,有什么帮助吗?

1 个答案:

答案 0 :(得分:13)

那是因为你总是调用相同的静态方法SHA256.Create。 SHA256是一个抽象类,它的后代提供了另一种方法。实际上,Resharper会向您发出警告,表明您正在从派生类型访问静态成员。

实际上,调用SHA256.Create与调用HashAlgorithm.Create相同。两个类在内部调用相同的实现,只是将结果转换为不同的类型。

SHA256.Create方法将创建在machine.config中指定的默认实现,并且可以在app.config中重写

如果您想使用特定的提供商,请使用SHA256.Create(string)传递您要使用的提供商的名称。

例如:

SHA256.Create("System.Security.Cryptography.SHA256Cng");
HashAlgorithm.Create("System.Security.Cryptography.SHA256Cng");
SHA256.Create("System.Security.Cryptography.SHA256CryptoServiceProvider");

修改

HashAlgorithm.Create的文档指定了有效算法名称的列表。 MSDN文章Mapping Algorithm Names to Cryptography Classes描述了如何将算法名称映射到其他提供程序(您自己的,第三方,硬件加速或其他)并使用它们而不是默认算法。

编辑2

也可以通过编程方式更改映射。因此,要将“Dog”映射到SHA512CryptoServiceProvider,您只需要写:

CryptoConfig.AddAlgorithm(
             typeof(System.Security.Cryptography.SHA512CryptoServiceProvider),
             "Dog");
var t4 = HashAlgorithm.Create("Dog");