Поделиться через


Улучшенное строгое именование

Сигнатура строгого имени — это механизм идентификации в .NET Framework для идентификации сборок. Это цифровая подпись с открытым ключом, которая обычно используется для проверки целостности данных, передаваемых от источника (подписыватель) получателю (проверятелю). Эта подпись используется в качестве уникального идентификатора для сборки и гарантирует, что ссылки на сборку однозначны. Сборка подписана как часть процесса сборки, а затем проверяется при загрузке.

Сигнатуры строгих имен помогают предотвратить вмешательство злоумышленников в сборку, а также ее повторное подписывание с использованием ключа исходного подписчика. Однако ключи строгого имени не содержат надежных сведений о издателе, а также не содержат иерархию сертификатов. Подпись строгого имени не гарантирует надежность лица, подписавшего сборку, или указывает, является ли этот человек законным владельцем ключа; он указывает только, что владелец ключа подписал сборку. Поэтому не рекомендуется использовать сигнатуру строгого имени в качестве проверяющего средства безопасности для доверия стороннего кода. Microsoft Authenticode — это рекомендуемый способ проверки подлинности кода.

Ограничения традиционных строгих имен

Технология строгого именования, используемая в версиях до .NET Framework 4.5, имеет следующие недостатки:

  • Ключи постоянно подвергаются атаке, а также улучшенные методы и оборудование упрощают вывод закрытого ключа из открытого ключа. Чтобы защититься от атак, необходимы более крупные ключи. Версии .NET Framework до .NET Framework 4.5 предоставляют возможность подписывать ключом любого размера (стандартный размер составляет 1024 бита), но подписывание сборки с новым ключом приводит к неработоспособности всех бинарных файлов, ссылающихся на старый идентификатор сборки. Поэтому очень трудно обновить размер ключа подписи, если требуется обеспечить совместимость.

  • Подписывание строгого имени поддерживает только алгоритм SHA-1. В последнее время было обнаружено, что SHA-1 недостаточно надёжен для безопасного хеширования. Поэтому требуется более строгий алгоритм (SHA-256 или более поздней версии). Возможно, SHA-1 потеряет свою конечную позицию, совместимую с FIPS, которая будет представлять проблемы для тех, кто решит использовать только программное обеспечение и алгоритмы, совместимые с FIPS.

Преимущества расширенных строгих имен

Основными преимуществами улучшенных строгих имен являются совместимость с уже существующими строгими именами и возможность утверждать, что одна идентичность эквивалентна другой.

  • Разработчики, имеющие предварительно подписанные сборки, могут перенести свои удостоверения в алгоритмы SHA-2 при сохранении совместимости с сборками, ссылающимися на старые удостоверения.

  • Разработчики, создающие новые сборки и не беспокоящиеся о ранее существовавших подписях строгого имени, могут использовать более безопасные алгоритмы SHA-2 и подписывать сборки, как и всегда.

Используйте расширенные строгие имена

Ключи строгого имени состоят из ключа подписи и идентификационного ключа. Сборка подписана ключом подписи и идентифицируется ключом идентификации. До .NET Framework 4.5 эти два ключа были идентичны. Начиная с .NET Framework 4.5 ключ удостоверения остается таким же, как и в более ранних версиях .NET Framework, но ключ подписи улучшен с помощью более строгого хэш-алгоритма. Кроме того, ключ подписи подписывается ключом удостоверения для создания контрасигнатуры.

Атрибут AssemblySignatureKeyAttribute позволяет метаданным сборки использовать предварительно существующий открытый ключ для удостоверения сборки, что позволяет старым ссылкам на сборку продолжать работать. Атрибут AssemblySignatureKeyAttribute использует контрподпись, чтобы гарантировать, что владелец нового ключа подписи является также владельцем старого ключа удостоверения.

Вход с помощью SHA-2 без миграции ключей

Выполните следующие команды из командной строки, чтобы подписать сборку без переноса подписи строгого имени:

  1. Создайте новый ключ удостоверения (при необходимости).

    sn -k IdentityKey.snk  
    
  2. Извлеките открытый ключ удостоверения и укажите, что алгоритм SHA-2 следует использовать при подписи с этим ключом.

    sn -p IdentityKey.snk IdentityPubKey.snk sha256  
    
  3. Подпишите сборку с отложенной подписью с помощью файла открытого ключа удостоверения личности.

    csc MyAssembly.cs /keyfile:IdentityPubKey.snk /delaySign+  
    
  4. Повторно подписать сборку с помощью полной пары ключей идентификации.

    sn -Ra MyAssembly.exe IdentityKey.snk  
    

Вход с помощью SHA-2 с помощью миграции ключей

Выполните следующие команды из командной строки, чтобы подписать сборку с помощью перенесенной сигнатуры строгого имени.

  1. Создайте пару ключей удостоверения и подписи (при необходимости).

    sn -k IdentityKey.snk  
    sn -k SignatureKey.snk  
    
  2. Извлеките открытый ключ подписи и укажите, что алгоритм SHA-2 должен использоваться при подписи с этим ключом.

    sn -p SignatureKey.snk SignaturePubKey.snk sha256  
    
  3. Извлеките идентификационный открытый ключ, который определяет хэш-алгоритм для создания косвенной подписи.

    sn -p IdentityKey.snk IdentityPubKey.snk  
    
  4. Создайте параметры атрибута AssemblySignatureKeyAttribute и подключите его к сборке.

    sn -a IdentityPubKey.snk IdentityKey.snk SignaturePubKey.snk  
    

    Это создает выходные данные, аналогичные приведенным ниже.

    Information for key migration attribute.
    (System.Reflection.AssemblySignatureKeyAttribute):
    publicKey=
    002400000c80000094000000060200000024000052534131000400000100010005a3a81ac0a519
    d96244a9c589fc147c7d403e40ccf184fc290bdd06c7339389a76b738e255a2bce1d56c3e7e936
    e4fc87d45adc82ca94c716b50a65d39d373eea033919a613e4341c66863cb2dc622bcb541762b4
    3893434d219d1c43f07e9c83fada2aed400b9f6e44ff05e3ecde6c2827830b8f43f7ac8e3270a3
    4d153cdd
    
    counterSignature=
    e3cf7c211678c4d1a7b8fb20276c894ab74c29f0b5a34de4d61e63d4a997222f78cdcbfe4c91eb
    e1ddf9f3505a32edcb2a76f34df0450c4f61e376b70fa3cdeb7374b1b8e2078b121e2ee6e8c6a8
    ed661cc35621b4af53ac29c9e41738f199a81240e8fd478c887d1a30729d34e954a97cddce66e3
    ae5fec2c682e57b7442738
    

    Затем эти выходные данные можно преобразовать в AssemblySignatureKeyAttribute.

    [assembly:System.Reflection.AssemblySignatureKeyAttribute(
    "002400000c80000094000000060200000024000052534131000400000100010005a3a81ac0a519d96244a9c589fc147c7d403e40ccf184fc290bdd06c7339389a76b738e255a2bce1d56c3e7e936e4fc87d45adc82ca94c716b50a65d39d373eea033919a613e4341c66863cb2dc622bcb541762b43893434d219d1c43f07e9c83fada2aed400b9f6e44ff05e3ecde6c2827830b8f43f7ac8e3270a34d153cdd",
    "e3cf7c211678c4d1a7b8fb20276c894ab74c29f0b5a34de4d61e63d4a997222f78cdcbfe4c91ebe1ddf9f3505a32edcb2a76f34df0450c4f61e376b70fa3cdeb7374b1b8e2078b121e2ee6e8c6a8ed661cc35621b4af53ac29c9e41738f199a81240e8fd478c887d1a30729d34e954a97cddce66e3ae5fec2c682e57b7442738"
    )]
    
  5. Отложенная подпись сборки с помощью открытого ключа удостоверения.

    csc MyAssembly.cs /keyfile:IdentityPubKey.snk /delaySign+  
    
  6. Полностью подписать сборку с помощью пары ключей для подписи.

    sn -Ra MyAssembly.exe SignatureKey.snk  
    

См. также