Dot-Net

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

  • May 18, 2019

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

如何用如此花哨的公鑰生成簽名密鑰?

那是 ECMA 標准定義的公鑰。

這是為了處理三個相互衝突的要求:

  1. 一種確保程序集由其創建者簽名並且不可能由欺詐性的另一方創建的機制。
  2. CLI 以這樣的方式公開定義,其他人可以自由地實現一個版本(Mono 將是一個真實的例子)。
  3. 每個版本的框架都有一個標準的類庫。

這三件事不能同時發生!

如果我創建一個 .NET 版本(第 2 點),那麼我需要提供一個標準庫版本(第 3 點),它需要被信任(第 1 點),所以我需要對其進行簽名以證明我’米微軟。哦等等,我不是微軟!(嗯,又是第 2 點)。

相反,發生的是:

  1. 我創建了一個公鑰-私鑰對。信任在我的框架庫實現中建構新版本的程序集的人可以訪問私鑰,任何在 CLI 實現上進行任何工作的人都可以知道公鑰。
  2. 我將相關程序集標記為已使用與公鑰00000000000000000400000000000000(在 ECMA 標準中定義)對應的密鑰進行了簽名,儘管它們實際上是使用上述私鑰簽名的。
  3. 在 CLI 的程式碼中,對聲稱已使用與公鑰對應的密鑰進行簽名的程序集的任何檢查都將00000000000000000400000000000000使用真正的公鑰進行檢查。如果檢查成功,那麼它只能由我們信任的建構這些程序集的人簽名。

當然,MS 的框架不會信任我們的程序集,Mono 的不會信任它們,我們也不會信任它們中的任何一個,因為我們都有不同的真實密鑰,對應於 ECMA 標準密鑰。這是應該的。

同時,00000000000000000400000000000000不匹配任何真正有效的公鑰這一事實意味著它不可能與任何其他公鑰發生衝突。

引用自:https://stackoverflow.com/questions/7205272