日期:2014-05-18  浏览次数:21096 次

publickeytoken可以代替公钥?
dotnet的强名称机制有点糊涂 
假如被引用的程序集ref.dll经过了强签名 得到了publickey公钥和一个publickeytoken 于是在ref.dll的清单里存储有他的publickey

如下

.publickey = (00 24 00 00 04 80 00 00 94 00 00 00 06 02 00 00 // .$..............
  00 24 00 00 52 53 41 31 00 04 00 00 01 00 01 00 // .$..RSA1........
  59 24 17 37 A9 39 AA 33 14 E4 FF BA B0 25 BF 82 // Y$.7.9.3.....%..
  83 98 96 89 9B C0 5B 3D 3F 63 89 2A D9 F6 9F A3 // ......[=?c.*....
  49 B9 40 26 A8 45 F4 A8 EA 1D 24 96 D1 D9 11 40 // I.@&.E....$....@
  0F F4 99 0B D4 1F 1C FF EC 78 71 AE 9F F4 99 96 // .........xq.....
  F0 51 C8 0A A8 BB 78 E6 2F 98 80 D2 1F D1 F5 01 // .Q....x./.......
  D0 F7 52 7E 7E D1 82 63 B0 BC B8 88 0D 1E A6 C5 // ..R~~..c........
  F3 08 38 2C 3D 42 F6 7D 91 66 4C A0 2C 18 23 6F // ..8,=B.}.fL.,.#o
  BA 32 5F 73 F6 5D 06 14 20 A6 3A AB 77 C6 4D C2 ) // .2_s.].. .:.w.M.

 而client.exe引用了ref.dll 于是在client.exe的清单中有ref.dll的publickeytoken

.assembly extern ref
{
  .publickeytoken = (87 07 DA 03 C3 5A 1D 12 ) // .....Z..
  .ver 2:0:0:0
}


强名称说是讲将程序集的hash码用私钥签名 然后得到一个签名值 然后客户端用公钥解密得到hash码并计算所引用程序集的hash码看二者是否相等来验证是否原来所引用的程序集 但是在客户端的清单中只有publickeytoken 并没有存储公钥 是否通过publickeytoken可以算出公钥?


------解决方案--------------------
如果可以算出公钥就没有意义了。公钥和私钥相互推算出来基本是不可能的。这也是这种加密体制的基础。
------解决方案--------------------
publickeytoken是根据publickey+程序集的Hash值计算出来的
如果是同一个程序集,那么再次计算的结果一定一样,
如果不是同一个程序集,那么计算的结果基本上是不一样的
(看看token就知道一共有多少种可能了,遇到两个不同程序集计算出来的结果一样绝对要去买彩票了)