1、强名称签名(StrongName Sign)
强名称是由程序集的标识加上公钥和数字签名组成的。其中,程序集的标识包括简单文本名称、版本号和区域性信息(如果提供的话)。 强名称是使用相应的私钥,通过程序集文件(包含程序集清单的文件,并因而也包含构成该程序集的所有文件的名称和散列)生成的。 Microsoft® Visual Studio® .NET 和 Windows 软件开发包 (SDK) 中提供的其他开发工具能够向一个程序集分配多个强名称。 强名称相同的程序集应该是相同的。
通过签发具有强名称的程序集,您可以确保名称的全局唯一性。 强名称还特别满足以下要求:
- 强名称依赖于唯一的密钥对来确保名称的唯一性。 任何人都不会生成与您生成的相同的程序集名称,因为用一个私钥生成的程序集的名称与用其他私钥生成的程序集的名称不相同。
- 强名称保护程序集的版本沿袭。 强名称可以确保没有人能够生成您的程序集的后续版本。 用户可以确信,他们所加载的程序集的版本出自创建该版本(应用程序是用该版本生成的)的同一个发行者。
- 强名称提供可靠的完整性检查。 通过 .NET Framework 安全检查后,即可确信程序集的内容在生成后未被更改过。 但请注意,强名称中或强名称本身并不暗含信任级别,例如由数字签名和支持证书提供的信任。
a):生成密钥对,生成的密钥由开发负责人保管
Sn -k Key.snk
b):提取公钥,公钥分发给下属开发人员
sn -p Key.snk Key.public.snk
c):生成强名称签名,并设置延迟签名的程序集
在VS中配置强名称签名:
打开项目属性页->签名,选择为程序集签名,浏览选择刚才创建的公钥。然后,选择延迟签名。
c):开发完成后,由拥有私钥访问权限的人为程序集(A.dll)签名。
SN.exe -Ra A.dll Key.snk
延迟签名:
开发人员在日常使用中无法访问严密保护的密钥对。 公钥通常是可用的,但对私钥的访问权仅限于少数个人。 开发强名称程序集时,每个引用具有强名称的目标程序集的程序集中都包含了用于为目标程序集指定强名称的公钥的标记。 这要求公钥在开发过程中可用。
因此,可以在生成时使用延迟签名或部分签名,在可迁移可执行 (PE) 文件中为强名称签名保留空间,将实际签名延迟至后面某些阶段。
2、数字证书签名
数字证书由可信任的第三方机构颁布,因此经过数字证书签名的程序集,可以标识唯一的发布者。还可以减少杀毒软件的误报
有数字证书签名与无数字证书签名的程序集对比:
通过对属性页的对比,可以判断程序是否是来自于可信的的发布者。