.NET核心程序集中非常特殊的PublicKey

Kir*_*nko 8 .net strongname .net-assembly public-key

我注意到核心.NET程序集的PublicKey = 00000000000000000400000000000000.它不仅比sn.exe允许生成(最小384位)更短,而且还有很多零.

如何用如此精美的公钥生成签名密钥?

Jon*_*nna 6

这是ECMA标准定义的公钥.

这是为了处理三个相互冲突的要求:

  1. 一种机制,确保程序集由其创建者签名,并且不能由欺诈性其他方创建.
  2. CLI是以公开的方式定义的,以便其他人可以自由地实现一个版本(Mono将是一个真实的例子).
  3. 每个版本的框架都有一个标准的类库.

这三件事不可能同时发生!

如果我创建一个.NET版本(第2点),那么我需要提供一个标准库的版本(第3点),这需要被信任(第1点),所以我需要签名来证明我'微软.哦等等,我不是微软!(呃,再次点2).

相反,会发生什么:

  1. 我创建了一个公钥 - 私钥对.受信任的人在我的框架库实现中构建新版本的程序集可以访问私钥,任何从事CLI实现的人都可以知道公钥.

  2. 我将相关程序集标记为已使用与公钥对应的密钥00000000000000000400000000000000(在ECMA标准中定义)进行签名,但实际上它们是使用上述私钥签名的.

  3. 在CLI中的代码中,00000000000000000400000000000000使用真实公钥检查声称已使用与公钥对应的密钥签名的程序集.如果这检查出来,那么它只能由我们信任的人签署这些程序集.

当然,MS的框架不会信任我们的程序集,Mono不会信任它们,我们也不会相信它们中的任何一个,因为我们都有与ECMA标准密钥相对应的不同真实密钥.这是应该的.

同时,00000000000000000400000000000000与任何真正有效的公钥不匹配的事实意味着它不可能与任何其他公钥冲突.