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