共享程序集必须是强名称的,所以这里简单介绍下它的机理。
不对称密码术: 包含公钥/私钥对,即 由私钥加密的数据内容,只有该配对的公钥才可解密。.NET强名称程序集对此
的应用:进行数字签名,并解密。可通过.NET提供的SDK工具sn,来制造新的公钥/私钥对。如:sn -k mykey.snk
数字签名: 散列编码程序集内容,结果大约几百字节。用私钥加密之,结果即为数字签名。
强命名过程: 进行 数字签名,并放入程序集中某个CLR能够访问的位置。在程序集清单中存放公钥,
则完成了强名称的程序集命名。
公钥令牌: public key token,引用强名称程序集时,散列编码强名称程序集中的公钥(内容很大)为
八字节的数值(公钥令牌),并放入自身的程序集清单中。此在compile阶段即完成。
共享程序集安装:共享程序集位于GAC(global assembly cache)中,XP系统中为 C:\WINDOWS\assembly。
其过程实质上是进行程序集内容的验证,如下:
1、GAC获取程序集的数字签名,并公钥解密之,得到其散列编码值
2、GAC散列编码程序集内容,并比对1结果,匹配,则安装。
消费程序集 载入 共享程序集 的整个过程(过程2 雷同 共享程序集安装,
绑定时做判断,主要是防止程序集于GAC中被恶意篡改),如下:
1、公钥令牌验证:CLR读取 共享程序集 的公钥,产生 公钥令牌,并比对 消费程序集 中的 公钥令牌,
不匹配,则CLR异常。
2、程序集内容验证:匹配,CLR对 共享程序集 进行 数字签名,并比对 共享程序集 中已存在
(命名阶段嵌入进去的)的 数字签名,匹配,则加载,否则CLR异常。
延迟加载: 强命名时,不进行数字签名,仅预留数字签名的空间,并于manifest中包括公钥(这样引用程序集
则可产生public key token,不影响程序开发)。如此的 程序集必须关闭签名验证的功能,才能进行GAC的安装
和程序集的加载,待部署时,再进行数字签名的工作。这里简单demo之,设有A.dll:
1、获取公钥/私钥对: sn -k myKey.snk
2、获取公钥/私钥对中的公钥: sn -p myKey.snk myPublicKey.snk
3、AssemblyInfo.cs文件中,打开延迟加载,并指定公钥
4、关闭签名验证功能:sn -Vr A.dll (开发中关闭,因为A.dll未数字签名,仅包括公钥)
5、打开签名验证功能:sn -Vu A.dll
6、数字签名:sn -R A.dll myKey.snk