然后GAC的出现,解决了这个问题。GAC中对于可以同时存在同一个DLL的多个不同的版本。如果多个程序都用到了这个DLL,那么这个程序就可以到GAC中去找相应版本的DLL.但是在GAC中,比如说同一个Data.dll,即使有多个版本的文件,但是其文件名都应该全是Data.dll,而且在不同的目录总,其version信息不是在文件名中体现出现了,而是在DLL的头信息中存储的。每个程序都会有一个程序集清单,这个清单存在和程序同名的.manifest文件中,里面列出其所需要的所有依赖,这儿所列出的依赖可不是简单地靠文件明来区分的,而是根据一种叫做“强文件名”的东西区分的。
<?xml version=‘1.0‘ encoding=‘UTF-8‘ standalone=‘yes‘?> <assembly xmlns=‘urn:schemas-microsoft-com:asm.v1‘ manifestVersion=‘1.0‘> <dependency> <dependentAssembly> <assemblyIdentity type=‘win32‘ name=‘Microsoft.VC80.CRT‘ version=‘8.0.50608.0‘ processorArchitecture=‘ x86‘ publicKeyToken=‘1fc8b3b9a1e18e3b‘ /> </dependentAssembly> </dependency> </assembly>我们发现原来这是一个XML格式的文件,其中<dependency>这一部分指明了其依赖于一个名字叫做Microsoft.VC80.CRT的库。但是我们发现,<assemblyIdentity>属性里面还有其它的东东,分别是 type系统类型,version版本号,processorArchitecture平台环境,publicKeyToken公匙(一般用来标示一个公司),把他们加在一起便成了“强文件名”了,有了这种“强文件名”,我们就可以根据其区分不同的版本、不同的平台,总之,有了这种强文件名,系统中可以有多个不同版本的相同的库共存而不会发生冲突。
下面我们考虑几种可能被篡改的情况
有人仅仅修改了DLL的内容,并没有修改加密后的值,此时很容易被程序发现出来,因为解密后的值和DLL内容不一致,程序会提示异常。
有人不仅修改了DLL的内容,还想修改加密后的值,但是要知道,此时的用户是没有原来的开发者的私钥的,如果他随便用一个私钥加密,那么在程序解密的是,用那个公钥是解密不出来任何东西的,因为公钥私钥是对应的。此时,程序会提示异常。这篇文章比较细致的解释了公钥私钥对于DLL加密的过程。
有时候会在Web.config文件中Runtime标签下看到一些<runtime>bindingRedirect的内容,这里涉及到了PublicKey。这里的作用是把不同版本的文件映射到某一个特定的版本,即程序清单中记载的某个dll是2.0的版本,可是程序在运行的时候在GAC中只找到1.0的版本,那么告诉程序此时不提示异常,只要把这个1.0版本当成2.0版本就可以了。
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35"/> <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0"/> </dependentAssembly> </assemblyBinding> </runtime>
.NET中的PublicKeyToken以及强命名问题,布布扣,bubuko.com
原文:http://blog.csdn.net/sundacheng1989/article/details/25101309