开发人员可以通过四种方式使用 Windows 软件开发包 (SDK) 创建加密对象:
通过使用 new 运算符创建对象。
通过调用特定加密算法的抽象类上的 Create 方法,创建实现特定加密算法的对象。
通过调用 System.Security.Cryptography.CryptoConfig.CreateFromName 方法,创建实现特定加密算法的对象。
通过对某类型的算法(如 SymmetricAlgorithm)的抽象类调用 Create 方法,创建实现加密算法的类(如对称分组加密)的对象。
例如,假设开发人员要计算一组字节的 SHA1 哈希。 System.Security.Cryptography 命名空间包含 SHA1 算法的两个实现,一个是纯粹的托管实现,另一个包装 CryptoAPI。 开发人员可以通过调用 new 运算符来选择实例化特定的 SHA1 实现(如 SHA1Managed 类)。 但是,如果公共语言运行时加载哪一个类无关紧要,只要该类实现 SHA1 哈希算法,那么开发人员就可以通过调用 System.Security.Cryptography.SHA1.Create 方法来创建对象。 该方法调用 System.Security.Cryptography.CryptoConfig.CreateFromName("System.Security.Cryptography.SHA1"),它必须返回 SHA1 哈希算法的实现。
开发人员还可以调用 System.Security.Cryptography.CryptoConfig.CreateFromName("SHA1"),因为在默认情况下,加密配置包括 .NET Framework 中提供的算法的简短名称。
如果使用哪一种哈希算法无关紧要,那么开发人员就可以调用 System.Security.Cryptography.HashAlgorithm.Create 方法,它返回一个对象,该对象实现哈希转换。
在配置文件中映射算法名称
默认情况下,运行时为所有四种方案返回 System.Security.Cryptography.SHA1CryptoServiceProvider class 对象。 但是,计算机管理员可以更改最后两种方案中的方法返回的对象的类型。 为此,必须在计算机配置文件 (Machine.config) 中将友好算法名称映射到要使用的类。
下面的示例说明如何配置运行时,以使 System.Security.Cryptography.SHA1.Create、System.Security.CryptoConfig.CreateFromName("SHA1") 和 System.Security.Cryptography.HashAlgorithm.Create 返回 MySHA1HashClass 对象。
<configuration>
<!-- Other configuration settings. -->
<mscorlib>
<cryptographySettings>
<cryptoNameMapping>
<cryptoClasses>
<cryptoClass MySHA1Hash="MySHA1HashClass, MyAssembly
Culture='en', PublicKeyToken=a5d015c7d5a0b012,
Version=1.0.0.0"/>
</cryptoClasses>
<nameEntry name="SHA1" class="MySHA1Hash"/>
<nameEntry name="System.Security.Cryptography.SHA1"
class="MySHA1Hash"/>
<nameEntry name="System.Security.Cryptography.HashAlgorithm"
class="MySHA1Hash"/>
</cryptoNameMapping>
</cryptographySettings>
</mscorlib>
</configuration>
可以在 <cryptoClass> 元素中指定特性的名称(上一个示例将该特性命名为 MySHA1Hash)。 <cryptoClass> 元素中的特性的值是公共语言运行时用来查找类的字符串。 可以使用满足指定完全限定的类型名称中指定的要求的任何字符串。
许多算法名称可以映射到同一个类。 <nameEntry> 元素将类映射到一个友好算法名称。 name 特性可以是在调用 System.Security.Cryptography.CryptoConfig.CreateFromName 方法时使用的字符串或是 System.Security.Cryptography 命名空间中的抽象加密类的名称。 class 特性的值是 <cryptoClass> 元素中的特性的名称。
![]() |
---|
可以通过调用 System.Security.Cryptography.SHA1.Create 或 Security.CryptoConfig.CreateFromName("SHA1") 方法来获取 SHA1 算法。每一个方法只保证它返回能实现 SHA1 算法的对象。没有必要在配置文件中将算法的每一个友好名称都映射到同一个类。 |
有关默认名称以及它们所映射到的类的列表,请参见 CryptoConfig 类。