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

8

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

如何生成带有如此花哨的公钥签名密钥?

2个回答

6
那是由ECMA标准定义的公钥。它要解决三个冲突的要求:
1. 一种机制来确保程序集是由其创建者签名并且不能被欺诈他方创建。 2. CLI需要以公开的方式定义,以便其他人可以自由地实现版本(Mono就是一个现实的例子)。 3. 每个框架版本都需要提供一个标准类库。
这三件事情不能同时发生!
如果我创建了.NET的一个版本(第2点),那么我需要提供一个标准库的版本(第3点),这个库需要得到信任(第1点),所以我需要签名来证明我是Microsoft。哦等等,我不是Microsoft!(嗯,又回到了第2点)。
相反,发生了以下情况:
1. 我创建了一对公私钥。在我的框架库实现中,有权构建新版本的程序集的人可以访问私钥,公钥可以被任何在CLI实现上工作的人知道。 2. 我将相关程序集标记为已使用与ECMA标准定义的公钥00000000000000000400000000000000相对应的密钥进行签名,尽管它们实际上是使用上述私钥进行签名的。 3. 在CLI代码中,对声称已使用与公钥00000000000000000400000000000000相对应的密钥进行签名的程序集的任何检查都会使用真实的公钥进行检查。如果这个检查通过,那么只有我们信任构建这些程序集的人才能签名。
当然,Microsoft的框架不会信任我们的程序集,Mono也不会信任它们,我们也不会信任它们,因为我们所有人都有不同的与ECMA标准密钥相对应的真实密钥。这就是应该的。
同时,00000000000000000400000000000000不匹配任何真实有效的公钥,这意味着它不可能与任何其他公钥发生冲突。

+Jon Hanna,感谢您的详细解释!我怀疑这个键是特殊的,现在我知道了。 - Kirill Kovalenko
@KirillKovalenko 这个答案发布已经有7年了。它似乎与其他相关信息的来源一致,比如Mono项目的这个页面:程序集和GAC。有没有什么理由不将这个答案标记为“已接受”? - Solomon Rutzky

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接