强名称程序集

共享程序集必须是强名称的,所以这里简单介绍下它的机理。

 

不对称密码术: 包含公钥/私钥对,即 由私钥加密的数据内容,只有该配对的公钥才可解密。.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

 

 

 

 

posted @ 2008-07-28 13:58  FallingAutumn  阅读(314)  评论(0编辑  收藏  举报