两种程序集,两种部署
CLR支持两种程序集:弱命名和强命名(非官方叫法)。
弱命名程序集和强命名的程序集结构完全相同。二者的区别在于,强命名的程序集使用发布者的公钥/私钥进行了签名。这一对密钥允许程序集进行唯一标识、保护和版本控制,并允许程序集部署到用户机器的各个地方,甚至可以部署到Internet上。由于程序集被唯一地标识,所以当应用程序绑定到强命名程序集时,CLR可以应用一些已知安全的策略。
程序集可以采用两种方式部署:私有或者全局。私有部署的程序集是指部署到应用程序基目录或者某个子目录的程序集。弱命名方式只能以私有方式部署。之前讨论的部分都是私有部署的程序集。CLR在查找程序集时,会检查这些位置。强命名程序集既可以私有部署,也可全局部署。
为程序集分配强名称
由多个应用程序访问的程序集必须放到公认的目录。另外,检测到对程序集的引用时,CLR必须能自动检查该目录。但是,假如两个程序集都复制到相同的公认目录,最后一个安装的就是主要程序,会造成正在使用旧程序集的所有应用程序都无法正常工作。
只根据文件名来区分程序集是不够的。CLR必须支持对程序集进行唯一标识的机制。这就是“强命名程序集”。强命名有四个特性,以针对程序集进行唯一标识:文件名、版本号、语言文化和公钥。由于公钥数字很大,所以经常使用个总要派生的小Hash,称为公钥标记。
生成公钥
先创建.snk文件,包含二进制形式的公钥和私钥。然后用-p开关创建只含公钥的文件.PublicKey。第二次使用-tp开关执行,传递只含公钥的文件,得到输出。
创建强命名程序集:
也可以在VS中,通过项目属性的“为程序集签名”来创建。
“对文件进行签名”的含义是:生成强命名程序集时,程序集的FileDefault清单元数据表列出构成程序集的所有文件。每将一个文件添加到清单,都对文件内容进行Hash处理。Hash值和文件名都储存在FileDefault表中。
生成包含清单的PE文件后,会对PE文件的完整内容进行Hash处理。Hash值用发布者的私钥进行签名,得到的RSA数字签名存储到PE文件的一个保留区域。