关于程序集强名称的简单入门
一些对强名称的基本概念:
1,什么是强命名?
通常的理解,一个程序集(assembly)的名称就是它的文件名,我们可以通过这个文件名来引用该程序集。但是这样会导致一个版本问题,比如一个程序集做了更新,我们想部署更新后的程序集,但是又不想破坏已有的程序对原版本程序集的引用,如果能引入一个版本的概念,那么我们就可以同时部署多个版本的程序集了。为支持版本,.Net推出了strong name (强名称)的概念,一个程序集的强名称由以下属性组成:
file name, version number, culture information, public key and digital signature.
因此哪怕两个程序集的文件名相同,它们依然可以拥有不同的版本号,这样我们就可以在一台机器上同时部署相同名称程序集的不同版本,也就是side-by-side code execution。
2, 除了支持多版本功能外,程序集还支持哪些功能?
支持Authentication (程序集发布者的身份验证) 和 Interigy check (程序集的完整性检查,也就是检查发布到你手中的程序集是否被人篡改过)
让我们首先来看一下签名的过程:假设A公司需要对自己的一个程序集进行签名,那么A公司应该首先准备公钥私钥对 (public/private key pair), 然后在生成强名称过程中程序集的所有内容会首先进行hash计算(一般通过SHA算法),得到hash值,再用私钥 ( primary key) 将该hash值进行签名,并将签名结果也保持在该程序集(assembly)中。(此外公钥也会保存在程序集中,以利于其它程序进行引用)
使用者会首先用发布者的公钥将签名反编码(decode),然后将程序集的内容使用同样的hash计算得到hash值,再和签名进行比较,如果一致,则表明该程序集的内容未经篡改,同时也可以确认该程序集确实是由public key所代表的发布者发布的。
但是其中存在一个缺陷,就是如何保证你手头的public key就是你期望的程序集发布者的public key。假设一个用户在得到A公司的public key过程中,一个黑客想方设法让自己的public key传送到用户手里,同时将自己写的程序集也传送到用户手里,那么这种情况下该程序集通过了用户的验证,用户也以为public key是A公司发布的,因此就放心大胆的开始使用,结果就不幸中招。
解决这一问题的办法是认证。也就是由用户信任的认证机构颁发证书,表明用户收到的公钥确实是由A公司。
4,什么是delayed signing (延迟签名)?
由于签名需要用到发布者的私钥,而一般来说这些私钥由少数人保管(而公钥一般都是公开的),只有在程序正式发布的时候才可以得到,那么这样就有一个问题,就是在开发阶段,无法为程序集生成强名称。为了解决这个问题,我们可以采用延迟签名的方式,也就是开发的时候只使用公钥生成强名称,发布的时候再使用私钥生成签名。