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

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

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

如何使用如此花哨的公钥生成签名 key ?

最佳答案

这是 ECMA 标准定义的公钥。

它是为了处理三个相互矛盾的要求:

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

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

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

    相反,发生的是:
  • 我创建了一个公私钥对。在我的框架库实现中构建新版本程序集的人可以访问私钥,任何在 CLI 实现上进行任何工作的人都可以知道公钥。
  • 我将相关程序集标记为已使用与公钥相对应的 key 00000000000000000400000000000000 签名(在 ECMA 标准中定义),尽管它们实际上是用上面提到的私钥签名的。
  • 在 CLI 的代码中,任何对声称已使用与公钥相对应的 key 签名的程序集的检查 00000000000000000400000000000000使用真实的公钥进行检查。如果这检查出来,那么它只能由我们信任的人在构建这些程序集时签名。

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

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

    关于.net - .NET 核心程序集中非常特殊的 PublicKey,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7205272/

    相关文章:

    sql-server-2012 - SQL Server 2012 不会加载 CLR 4.0 汇编

    .net - 如何在新的AppDomain中将程序集仅作为反射加载?

    .net - 对强命名 .NET 程序集进行数字签名

    c# - 如何在.Net控制台应用程序WCF服务中启用跨源资源共享?

    c# - 用 .NET 编写的 OSS Twitter 克隆

    powershell - 从 dll 的字节数组加载程序集

    .net - 如何告诉我的 ASP.NET 应用程序使用任何版本的强命名程序集?

    .net - XmlDocument缓存内存使用

    .net - 将数据注入(inject) WCF 服务

    .net - 验证运行程序集的强名称