创建和使用具有强名称的程序集

强名称由程序集的身份——包括其简单文本名称、版本号,以及(如果提供)区域性信息——加上公钥和数字签名组成。 它使用相应的私钥从程序集文件中生成。 (程序集文件包含程序集清单,其中包含构成程序集的所有文件的名称和哈希。

警告

不要依赖强名称来保护安全性。 它们仅提供唯一标识。

强名称程序集只能使用来自其他强名称程序集的类型。 否则,强命名程序集的完整性将受到损害。

注释

尽管 .NET Core 支持强名称程序集,并且 .NET Core 库中的所有程序集都已签名,但大多数第三方程序集不需要强名称。 有关详细信息,请参阅 GitHub 上的 强名称签名

强名称场景

以下方案概述了使用强名称对程序集进行签名的过程,稍后通过该名称引用该程序集。

  1. 程序集 A 是使用以下方法之一使用强名称创建的:

  2. 开发环境或工具使用开发人员的私钥对包含程序集清单的文件哈希进行签名。 此数字签名存储在包含程序集 A 清单的可移植可执行文件(PE)文件中。

  3. 程序集 B 是程序集 A 的使用者。程序集 B 清单的引用部分包括表示程序集 A 公钥的标记。 代币是完整公钥的一部分,用于替代完整的密钥本身,以节省空间。

  4. 公共语言运行时在程序集放置在全局程序集缓存中时验证强名称签名。 在运行时按强名称绑定时,公共语言运行时将程序集 B 清单中存储的密钥与用于生成程序集 A 强名称的密钥进行比较。如果 .NET 安全检查通过并且绑定成功,则程序集 B 保证程序集 A 的位未被篡改,并且这些位实际上来自程序集 A 的开发人员。

注释

此方案无法解决信任问题。 除了强名称外,程序集还可以携带完整的Microsoft验证码签名。 验证码签名包括建立信任的证书。 请务必注意,强名称不需要用这种方式来对代码签名。 强名称仅提供唯一标识。

绕过受信任程序集的签名验证

从 .NET Framework 3.5 Service Pack 1 开始,当程序集加载到完全信任的应用程序域中(例如 MyComputer 区域的默认应用程序域)时,不会验证强名称签名。 这称为强名称绕过功能。 在完全信任环境中,对 StrongNameIdentityPermission 的请求总会成功,适用于已签名的完全信任程序集,无论其签名如何。 在这种情况下,强名称绕过功能可避免对完全信任程序集进行强名称签名验证的不必要的开销,从而使程序集能够更快地加载。

绕过功能适用于使用强名称签名且具有以下特征的任何程序集:

可以为单个应用程序或计算机禁用此功能。 请参阅 “如何:禁用强名称绕过功能”。

Title Description
如何创建公钥-私钥对 介绍如何创建用于对程序集进行签名的加密密钥对。
如何使用强名称对程序集进行签名 介绍如何创建强名称程序集。
增强的强签名 介绍 .NET Framework 4.5 中强名称的增强功能。
如何引用强名称程序集 描述如何在编译时或运行时引用强名称程序集中的类型或资源。
如何:禁用强名称绕过功能 介绍如何禁用绕过强名称签名验证的功能。 可以为所有应用程序或特定应用程序禁用此功能。
创建程序集 这是一篇关于单文件和多文件程序集的概述。
如何在 Visual Studio 中延迟对程序集进行签名 介绍如何在创建程序集后使用强名称对程序集进行签名。
Sn.exe (强名称工具) 介绍 .NET Framework 中包含的工具,该工具有助于创建具有强名称的程序集。 此工具提供密钥管理、签名生成和签名验证的选项。
Al.exe (程序集链接器) 介绍 .NET Framework 中包含的工具,该工具生成一个包含模块或资源文件中的程序集清单的文件。