程序集签名 - 基础知识

28

什么是程序集签名?为什么要这样做?

最简单的签名方式是什么?.snk文件有什么作用?

4个回答

39

另外两个答案都很好,但还有一个补充点。容易混淆“证书”签名和“强名称”签名。

强名称签名的目的是如Stefan Steinegger所说:让客户确定他们认为正在加载的代码确实是他们正在加载的代码。这就是所有强名称的用途。具体来说,强名称不会建立您和客户之间的任何信任关系。如果客户决定信任来自您的代码,那么他们需要找出您代码的正确强名称。 “密钥管理”问题并没有得到任何解决;客户负责找出如何知道要信任哪个密钥。

证书签名,即使用从Verisign或其他认证机构获得的证书进行签名,具有更复杂的目的。证书签名的目的是建立一个经过身份验证的信任链和身份,从认证机构到签署代码的组织。您的客户可能不信任您,您的客户甚至可能听都没听说过您,但是您的客户可以说“如果Verisign对作者的身份进行了担保,那么我就信任它们”。密钥管理问题对于客户来说减轻了,因为认证机构已经承担了这个负担。


1
+1,鉴于“证书”和“强名称”签名之间的比较,这是最完整的答案。 - hmcclungiii
非常清晰的区别!我仍然不太明白,如果我向客户发送签名或未签名的程序集,对客户有什么影响,因为其他人也可以发送签名的程序集?! - Verena Haunschmid
1
@VerenaHaunschmid:他们可以发送由您签名的汇编代码吗? - Eric Lippert

10

签名程序集是什么意思?

签名程序集就是给程序集一个强名称。

为什么要这样做?

首先,让我们进行一个重要的区分。在.NET中,将程序集分类的一种方式如下:

  • 私有程序集,仅用于单个应用程序(默认)。它通常在与应用程序相同的目录中找到。
  • 共享程序集,可全局访问计算机中的所有应用程序。它通常在全局程序集缓存(GAC)中找到,并且必须进行签名,即必须具有强名称(由程序集的名称、版本、公钥和文化组成)。

为什么要这么做?拥有强名称可以保证您的程序集是独一无二的,没有人能够窃取GUID(如COM)以创建具有相同名称的不同对象。换句话说,您确保加载已签名的程序集时正在加载您认为应该加载的内容。Eric Lippert在这里对这个问题提供了一个很好的答案。

这并不意味着签名的程序集可信任。为此,程序集可以包含Authenticode,一种数字签名,以提供有关程序集开发者/公司的信息。

最简单的签名方法是什么?

以下是MSDN逐步说明的简短版本:

  1. 使用SN.EXE创建一个强密钥

    sn -k C:\mykey.snk

  2. 从Visual Studio,进入项目属性页的签名选项卡,并勾选“签署程序集”来选择刚刚创建的文件 Check sign assembly in Visual Studio

  3. 重新构建项目,完成。您的程序集现在已经签名。您可以在项目的CSPROJ文件中看到这一点:

<PropertyGroup>
   <SignAssembly>true</SignAssembly>
</PropertyGroup>
<PropertyGroup>
   <AssemblyOriginatorKeyFile>mykey.snk</AssemblyOriginatorKeyFile>
</PropertyGroup>
  • gacutil 工具允许您管理 GAC 中的共享程序集:
    • 安装: gacutil /i myassembly.dll
    • 在 GAC 中查看程序集: gacutil /l myassembly.dll
    • 卸载: gacutil /u myassembly.dll
  • .SNK 文件有什么作用?

    SNK 是“Strong Name Key”文件。


    7
    这意味着为程序集赋予独特的身份标识。这样做是为了确保程序集来自特定的源。请参阅MSDN文章Strong-Named Assemblies。强名称程序集支持Side by Side ExecutionAssembly placement in the GACVersioning和其他一些功能。
    使用Visual Studio中的项目属性,签名选项卡是最简单的签名方式。这实际上会在.csproj文件中添加一个XML条目,告诉构建引擎使用指定的密钥文件对程序集进行签名。该密钥文件就是我们所说的".snk"文件,可使用.NET工具sn.exe生成。它包含了签名程序集所需的所有信息。

    并不是每个人都使用Visual Studio。 - hmcclungiii
    2
    这就是我提到sn.exe工具的原因。该工具包含在.Net 2.0框架中,Mono也包含它。 - Szymon Rozga

    7
    签名是为了证明程序集是由已知的个人或公司创建的,而不是被任何其他人更改的。
    在签名程序集时,会创建哈希并用私钥进行签名。如果程序集被更改,例如被恶意软件更改,可以通过使用公钥(包含在程序集中)检查哈希和签名来轻松发现。
    因此,签名程序集是为了保护目标系统免受黑客攻击。您可以在.NET配置中关闭签名检查。对于最终用户来说,有签名检查是符合其利益的。加载程序集时会检查签名。
    snk文件保存了签名程序集的私钥和检查程序集的公钥。它需要受到保护。如果某人获得了您的私钥,则可以像您一样签署程序集。
    最简单的签名方法是在项目设置中选择snk文件。

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接