强命名程序集的创建

  1. 使用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位的公有密钥散列值。
  2. 为程序集指定密钥文件

    在程序集的AssemblyInfo.cs代码文件中加入
    [assembly: AssemblyKeyFile("MyCompany.keys")]
    当编译器遇到该特性时,将打开MyCompany.keys文件,用私有密钥对程序集进行签名,并将公有密钥嵌入到清单中。

    具体签名步骤:
    在生成包含清单的PE文件后,该PE文件的整个内容被转换为一个散列值,散列值经由私有密钥签名,生成RSA数字签名存入PE文件的一个保留区域(不包括在散列值的计算中)。最后,PE文件的CLR表头被更新,以反映数字签名在文件中的嵌入位置。
    另外,发布者的公有密钥也被嵌入到PE文件的AssemblyDef清单元数据表中。
  3. 引用强命名程序集

    由于公有密钥过大,如果一个程序集引用了许多其他强命名程序集,那么它的最终文件很大一部分将被公有密钥信息占用。为节省空间,微软对公有密钥首先进行散列转换,然后只取散列值的最末尾64位(8个字节)。这个被截取的值在统计学上被认为是唯一的。最终存储在程序集AssemblyRef表中的公有密钥值其实就是这个被截取的8字节公有密钥标记。
posted on 2011-03-25 10:46  辛勤的代码工  阅读(393)  评论(0编辑  收藏  举报