将算法名称映射到加密类

注意

本文特定于 .NET Framework。 它不适用于 .NET 的较新版本实现,包括 .NET 6 及更高版本。

开发人员可通过四种方式使用 Windows SDK 创建加密对象:

  • 通过使用 new 运算符来创建对象。

  • 通过调用该算法的抽象类上的 Create 方法,创建实现特定加密算法的对象。

  • 通过调用 CryptoConfig.CreateFromName 方法创建实现特定加密算法的对象。

  • 创建实现加密算法类的对象(例如对称块密码),方法是在该类型的算法(如 SymmetricAlgorithm)的抽象类上调用 Create 方法。

例如,假设开发人员想要计算一组字节的 SHA1 哈希。 System.Security.Cryptography 命名空间包含 SHA1 算法的两个实现,一个纯托管实现和一个包装 CryptoAPI 的实现。 开发人员可以选择通过调用 new 运算符来实例化特定 SHA1 实现(如 SHA1Managed)。 但是,如果只要类实现 SHA1 哈希算法,公共语言运行时加载哪个类不重要,则开发人员可以通过调用 SHA1.Create 方法来创建对象。 此方法调用 System.Security.Cryptography.CryptoConfig.CreateFromName("System.Security.Cryptography.SHA1"),其必须返回 SHA1 哈希算法的实现。

开发人员还可以调用 System.Security.Cryptography.CryptoConfig.CreateFromName("SHA1"),因为默认情况下,加密配置包括 .NET Framework 中附带的算法的短名称。

如果使用哪种哈希算法不重要,则开发人员可以调用 HashAlgorithm.Create 方法,其返回实现哈希转换的对象。

映射配置文件中的算法名称

默认情况下,运行时返回所有四个方案的 SHA1CryptoServiceProvider 对象。 但是,计算机管理员可以更改最后两个方案中的方法返回的对象类型。 为此,必须将友好算法名称映射到要在计算机配置文件 (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> 元素中的特性的名称。

注意

可以通过调用 SHA1.Create 或 Security.CryptoConfig.CreateFromName("SHA1") 方法来获取 SHA1 算法。 每个方法仅保证它返回实现 SHA1 算法的对象。 无需将算法的每个友好名称映射到配置文件中的同一个类。

有关默认名称及其映射到的类的列表,请参阅 CryptoConfig

请参阅