强命名程序集的创建
- 使用SN(Strong Name Utility)工具创建密钥
例:
SN -k MyCompany.keys
创建一个名为MyCompany.keys的密钥文件,该文件包含一对以二进制格式存储的公有密钥和私有密钥。
查看公有密钥方法
创建一个只含有公有密钥的文件
SN -p MyCompany.keys MyCompany.Publickey
查看公有密钥
SN -tp MyCompany.Publickey
显示如下:
Microsoft (R) .NET Framework 强名称实用工具 版本 2.0.50727.42
Copyright (c) Microsoft Corporation. All rights reserved.
公钥为
0024000004800000940000000602000000240000525341310004000001000100d39eca296b0a9b
1d2abe6b417f0c7467ad060beba26613f2b0ffa28d3c9ddb9d5822c8e0d13d423e3d2d40c7a3b9
5bdff586844d5077353ac1c65108a54201661350e921a82874409770b93a97ac94e6adf82c6d03
afa5ab24cb9a24d78a7b0fe17a67ad180cf30c0e74368da60c44c7cc44f0c12d1bde7914076b5a
742595e0
公钥标记为 fe8416c3b621e0ed
公有密钥尺寸较大,不便使用。为方便开发人员,公有密钥标识应运而生,公有密钥标记是一个64位的公有密钥散列值。 - 为程序集指定密钥文件
在程序集的AssemblyInfo.cs代码文件中加入
[assembly: AssemblyKeyFile("MyCompany.keys")]
当编译器遇到该特性时,将打开MyCompany.keys文件,用私有密钥对程序集进行签名,并将公有密钥嵌入到清单中。
具体签名步骤:
在生成包含清单的PE文件后,该PE文件的整个内容被转换为一个散列值,散列值经由私有密钥签名,生成RSA数字签名存入PE文件的一个保留区域(不包括在散列值的计算中)。最后,PE文件的CLR表头被更新,以反映数字签名在文件中的嵌入位置。
另外,发布者的公有密钥也被嵌入到PE文件的AssemblyDef清单元数据表中。 - 引用强命名程序集
由于公有密钥过大,如果一个程序集引用了许多其他强命名程序集,那么它的最终文件很大一部分将被公有密钥信息占用。为节省空间,微软对公有密钥首先进行散列转换,然后只取散列值的最末尾64位(8个字节)。这个被截取的值在统计学上被认为是唯一的。最终存储在程序集AssemblyRef表中的公有密钥值其实就是这个被截取的8字节公有密钥标记。