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

时间:2011-08-26 13:22:19

标签: .net .net-assembly strongname public-key

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

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

2 个答案:

答案 0 :(得分:6)

这是ECMA标准定义的公钥。

要处理三个相互冲突的要求:

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

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

    相反发生的事情是:

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

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

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

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

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

答案 1 :(得分:0)

这不是问题的正确答案。这个答案唯一提供的是ECMA标准的指针,显然是带有CLI规范的ECMA-335。但是,此ECMA标准仅在唯一/固定值及其应命名的名称方面提供了基本定义。否则,它不提供有关如何以及在何处找到实际公钥的信息。值00000000000000000400000000000000不是公共密钥,它只是一个称为Standard Public Key的标记,与真实的公共密钥无关。此值用于为使用它的程序集计算公钥令牌,但是在处理程序集签名时,此值不用作RSA算法的任何公钥。您需要一个真实的公钥。该问题的正确答案应该是如何以及在哪里找到使用它的程序集的实际公钥