Усовершенствованное строгое именованиеEnhanced strong naming

Подпись строгого имени — это механизм идентификации сборок в .NET Framework.A strong name signature is an identity mechanism in the .NET Framework for identifying assemblies. Это цифровая подпись с открытым ключом, которая обычно используется для проверки целостности данных, передаваемых от инициатора (подписывающего) к получателю (проверяющему).It is a public-key digital signature that is typically used to verify the integrity of data being passed from an originator (signer) to a recipient (verifier). Эта подпись используется в виде уникального идентификатора сборки и гарантирует, что ссылки на сборку не являются неоднозначными.This signature is used as a unique identity for an assembly and ensures that references to the assembly are not ambiguous. Подписывание сборки является частью процесса сборки, что затем проверяется при ее загрузке.The assembly is signed as part of the build process and then verified when it is loaded.

Подписи строгого имени помогают предотвратить подделку сборки на стороне злоумышленника с последующей повторной подписью сборки оригинальным ключом подписавшего.Strong name signatures help prevent malicious parties from tampering with an assembly and then re-signing the assembly with the original signer’s key. Но ключи строгого имени не содержат никаких сведений об издателе, а также не содержат иерархию сертификатов.However, strong name keys don’t contain any reliable information about the publisher, nor do they contain a certificate hierarchy. Подпись строгого имени не гарантирует, что подписавшему сборку человеку можно доверять, и не указывает на то, что человек является правомерным владельцем ключа; она означает только то, что владелец ключа подписал сборку.A strong name signature does not guarantee the trustworthiness of the person who signed the assembly or indicate whether that person was a legitimate owner of the key; it indicates only that the owner of the key signed the assembly. Поэтому не рекомендуется использовать подпись строгого имени как средство проверки безопасности на доверие к коду сторонних разработчиков.Therefore, we do not recommend using a strong name signature as a security validator for trusting third-party code. Рекомендуемым способом проверки подлинности кода является Microsoft Authenticode.Microsoft Authenticode is the recommended way to authenticate code.

Ограничения обычных строгих именLimitations of conventional strong names

Технология строгого именования, используемая в версиях до .NET Framework 4.5, имеет указанные ниже недостатки:The strong naming technology used in versions before the .NET Framework 4.5 has the following shortcomings:

  • Ключи постоянно подвержены атакам, а улучшенные методы и оборудование облегчают поиск закрытого ключа по открытому.Keys are constantly under attack, and improved techniques and hardware make it easier to infer a private key from a public key. Для защиты от атак необходимы более длинные ключи.To guard against attacks, larger keys are necessary. Версии .NET Framework до .NET Framework 4.5 предоставляют возможность подписывания с помощью ключа любого размера (размер по умолчанию — 1024 бита), но подпись сборки новым ключом испортит все двоичные файлы, ссылающиеся на старый идентификатор сборки..NET Framework versions before the .NET Framework 4.5 provide the ability to sign with any size key (the default size is 1024 bits), but signing an assembly with a new key breaks all binaries that reference the older identity of the assembly. Поэтому изменение размера ключа подписи является крайне сложным, если необходимо обеспечить совместимость.Therefore, it is extremely difficult to upgrade the size of a signing key if you want to maintain compatibility.

  • Подпись строгого имени поддерживает только алгоритм SHA-1.Strong name signing supports only the SHA-1 algorithm. Недавно было показано, что алгоритма SHA-1 недостаточно для обеспечения безопасности хэширования.SHA-1 has recently been found to be inadequate for secure hashing applications. Поэтому необходим более надежный алгоритм (SHA-256 или выше).Therefore, a stronger algorithm (SHA-256 or greater) is necessary. Возможно, алгоритм SHA-1 утратит статус совместимого с FIPS, что станет проблемой для тех, кто предпочитает использовать только FIPS-совместимое программное обеспечение и алгоритмы.It is possible that SHA-1 will lose its FIPS-compliant standing, which would present problems for those who choose to use only FIPS-compliant software and algorithms.

Преимущества улучшенных строгих именAdvantages of enhanced strong names

Основными преимуществами улучшенных строгих имен являются совместимость с уже существующими строгими именами и возможность утверждения эквивалентности одного идентификатора другому.The main advantages of enhanced strong names are compatibility with pre-existing strong names and the ability to claim that one identity is equivalent to another:

  • Разработчики, которые имеют уже существующие подписанные сборки, могут перенести формирование их идентификаторов на алгоритм SHA-2, сохранив при этом совместимость со сборками, которые ссылаются на старые идентификаторы.Developers who have pre-existing signed assemblies can migrate their identities to the SHA-2 algorithms while maintaining compatibility with assemblies that reference the old identities.

  • Разработчики, которые создают новые сборки и не имеют существующих подписей строгого имени, могут использовать более безопасные алгоритмы SHA-2 и подписывать сборки так, как они делали всегда.Developers who create new assemblies and are not concerned with pre-existing strong name signatures can use the more secure SHA-2 algorithms and sign the assemblies as they always have.

Использование улучшенных строгих именUse enhanced strong names

Ключи строгого имени состоят из ключа подписи и ключа удостоверения.Strong name keys consist of a signature key and an identity key. Сборка подписывается с помощью ключа подписи и не зависит от ключа удостоверения.The assembly is signed with the signature key and is identified by the identity key. До выхода версии .NET Framework 4.5 эти ключи были идентичными.Prior to the .NET Framework 4.5, these two keys were identical. Начиная с .NET Framework 4.5 ключ удостоверения остается таким же, как и в более ранних версиях платформы .NET Framework, а ключ подписи улучшается с использованием более надежного хэш-алгоритма.Starting with the .NET Framework 4.5, the identity key remains the same as in earlier .NET Framework versions, but the signature key is enhanced with a stronger hash algorithm. Кроме того, ключ подписи подписывается ключом удостоверения для создания подписи другой стороны.In addition, the signature key is signed with the identity key to create a counter-signature.

Атрибут AssemblySignatureKeyAttribute позволяет метаданным сборки использовать уже существующий открытый ключ для идентификации сборки, что позволяет старым ссылкам на сборки продолжать работать.The AssemblySignatureKeyAttribute attribute enables the assembly metadata to use the pre-existing public key for assembly identity, which allows old assembly references to continue to work. Атрибут AssemblySignatureKeyAttribute использует подпись другой стороны для проверки того, является ли владелец нового ключа подписи также владельцем старого ключа удостоверения.The AssemblySignatureKeyAttribute attribute uses the counter-signature to ensure that the owner of the new signature key is also the owner of the old identity key.

Подписывание с использованием SHA-2 без переноса ключаSign with SHA-2, without key migration

Чтобы подписать сборку без переноса подписи строгого имени, выполните следующие команды в командной строке:Run the following commands from a command prompt to sign an assembly without migrating a strong name signature:

  1. Создайте ключ удостоверения (если необходимо).Generate the new identity key (if necessary).

    sn -k IdentityKey.snk  
    
  2. Извлеките открытый ключ удостоверения и укажите, что при подписывании этим ключом необходимо использовать алгоритм SHA-2.Extract the identity public key, and specify that a SHA-2 algorithm should be used when signing with this key.

    sn -p IdentityKey.snk IdentityPubKey.snk sha256  
    
  3. Используйте отложенную подпись сборки с помощью файла с открытым ключом удостоверения.Delay-sign the assembly with the identity public key file.

    csc MyAssembly.cs /keyfile:IdentityPubKey.snk /delaySign+  
    
  4. Повторно подпишите сборку с помощью полной пары ключей удостоверения.Re-sign the assembly with the full identity key pair.

    sn -Ra MyAssembly.exe IdentityKey.snk  
    

Подписывание с использованием SHA-2 с переносом ключаSign with SHA-2, with key migration

Чтобы подписать сборку с переносом подписи строгого имени, выполните следующие команды в командной строке:Run the following commands from a command prompt to sign an assembly with a migrated strong name signature.

  1. Создайте пару ключей удостоверения и подписи (если необходимо).Generate an identity and signature key pair (if necessary).

    sn -k IdentityKey.snk  
    sn -k SignatureKey.snk  
    
  2. Извлеките открытый ключ подписи и укажите, что при подписывании этим ключом необходимо использовать алгоритм SHA-2.Extract the signature public key, and specify that a SHA-2 algorithm should be used when signing with this key.

    sn -p SignatureKey.snk SignaturePubKey.snk sha256  
    
  3. Извлеките открытый ключ удостоверения, определяющий хэш-алгоритм, с помощью которого создается подпись другой стороны.Extract the identity public key, which determines the hash algorithm that generates a counter-signature.

    sn -p IdentityKey.snk IdentityPubKey.snk  
    
  4. Создайте параметры для атрибута AssemblySignatureKeyAttribute и прикрепите атрибут к сборке.Generate the parameters for a AssemblySignatureKeyAttribute attribute, and attach the attribute to the assembly.

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

    Вы увидите приблизительно следующее.This produces output similar to the following.

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

    Эти выходные данные затем могут быть преобразованы в AssemblySignatureKeyAttribute.This output can then be transformed into an AssemblySignatureKeyAttribute.

    [assembly:System.Reflection.AssemblySignatureKeyAttribute(
    "002400000c80000094000000060200000024000052534131000400000100010005a3a81ac0a519d96244a9c589fc147c7d403e40ccf184fc290bdd06c7339389a76b738e255a2bce1d56c3e7e936e4fc87d45adc82ca94c716b50a65d39d373eea033919a613e4341c66863cb2dc622bcb541762b43893434d219d1c43f07e9c83fada2aed400b9f6e44ff05e3ecde6c2827830b8f43f7ac8e3270a34d153cdd",
    "e3cf7c211678c4d1a7b8fb20276c894ab74c29f0b5a34de4d61e63d4a997222f78cdcbfe4c91ebe1ddf9f3505a32edcb2a76f34df0450c4f61e376b70fa3cdeb7374b1b8e2078b121e2ee6e8c6a8ed661cc35621b4af53ac29c9e41738f199a81240e8fd478c887d1a30729d34e954a97cddce66e3ae5fec2c682e57b7442738"
    )]
    
  5. Используйте отложенную подпись сборки с помощью открытого ключа удостоверения.Delay-sign the assembly with the identity public key.

    csc MyAssembly.cs /keyfile:IdentityPubKey.snk /delaySign+  
    
  6. Подпишите сборку с помощью полной пары ключей удостоверения.Fully sign the assembly with the signature key pair.

    sn -Ra MyAssembly.exe SignatureKey.snk  
    

См. такжеSee also