Совершенно особенный PublicKey в сборках ядра .NET - PullRequest
8 голосов
/ 26 августа 2011

Я заметил, что основные сборки .NET имеют PublicKey = 00000000000000000400000000000000. Мало того, что они короче, чем те, которые sn.exe позволяет генерировать (минимум 384 бита), но и имеют много нулей.

Как создать ключ подписи с таким необычным открытым ключом?

Ответы [ 2 ]

6 голосов
/ 13 января 2012

Это открытый открытый ключ стандарта ECMA.

Он предназначен для решения трех противоречивых требований:

  1. Механизм, который гарантирует, что сборки подписаны их создателями и не могли бытьсозданный мошеннической другой стороной.
  2. Чтобы CLI был определен открыто таким образом, чтобы другие люди могли свободно реализовывать версию (Mono был бы примером из реальной жизни).
  3. Что естьбыть стандартной библиотекой классов, доступной для каждой версии фреймворка.

Эти три вещи не могут происходить одновременно!

Если я создаю версию .NET(пункт 2), затем мне нужно предоставить версию стандартной библиотеки (пункт 3), которой нужно доверять (пункт 1), поэтому мне нужно подписать ее, чтобы доказать, что я Microsoft.Ой, подождите, я не Microsoft!(опять пункт 2).

Вместо этого происходит следующее:

  1. Я создаю пару открытый-закрытый ключ.Люди, которым доверяют создавать новые версии сборок в моей реализации библиотеки инфраструктуры, имеют доступ к закрытому ключу, открытый ключ может быть известен любому, кто работает над реализацией CLI.

  2. Я отмечаю соответствующие сборки как подписанные ключом, соответствующим открытому ключу 00000000000000000400000000000000 (определенному в стандарте ECMA), хотя на самом деле они были подписаны закрытым ключом, упомянутым выше.

  3. В коде в CLI любая проверка сборки, которая утверждает, что она подписана с ключом, соответствующим открытому ключу 00000000000000000400000000000000, проверяется с помощью реального открытого ключа.Если это подтвердится, то он может быть подписан только тем, кому мы доверяем в создании этих сборок.

Конечно, среда MS не будет доверять нашим сборкам, Mono не будет доверятьих, и мы не будем доверять ни одному из них, потому что у всех нас есть разные реальные ключи, соответствующие стандартному ключу ECMA.Что и должно быть.

Между тем тот факт, что 00000000000000000400000000000000 не соответствует ни одному действительному открытому ключу, означает, что он не может конфликтовать с любым другим открытым ключом.

0 голосов
/ 18 мая 2019

Это НЕ правильный ответ на вопрос.Единственное, что дает этот ответ, это указатель на стандарт ECMA, по-видимому, ECMA-335 со спецификациями CLI.Но этот стандарт ECMA предоставляет только базовое определение в терминах уникального / фиксированного значения и имени, которое должно называться.В противном случае он ничего не дает о том, как и где находится фактический открытый ключ.Значение 00000000000000000400000000000000 НЕ является открытым ключом, это всего лишь маркер под названием Стандартный открытый ключ, который не имеет ничего общего с реальным открытым ключом.Это значение используется для вычисления токена открытого ключа для сборки, которая его использует, но это значение не используется в качестве какого-либо открытого ключа алгоритма RSA при обработке подписи сборки.Вам нужен настоящий открытый ключ.Правильный ответ на вопрос должен состоять в том, как и где найти фактический открытый ключ для сборки, которая его использует

...