Partilhar via


Nomenclatura forte aprimorada

Uma assinatura de nome forte é um mecanismo de identidade no .NET Framework para identificar assemblies. É uma assinatura digital de chave pública que normalmente é usada para verificar a integridade dos dados que estão sendo passados de um originador (signatário) para um destinatário (verificador). Essa assinatura é usada como uma identidade exclusiva para um assembly e garante que as referências ao assembly não sejam ambíguas. O assembly é assinado como parte do processo de compilação e, em seguida, verificado quando é carregado.

Assinaturas de nomes fortes ajudam a impedir que partes mal-intencionadas adulterem um assembly e, em seguida, assinem novamente o assembly com a chave do signatário original. No entanto, as chaves de nome fortes não contêm informações confiáveis sobre o editor, nem uma hierarquia de certificado. Uma assinatura de nome forte não garante a confiabilidade da pessoa que assinou a assembleia ou indica se essa pessoa era uma proprietária legítima da chave; indica apenas que o proprietário da chave assinou o assembly. Portanto, não recomendamos o uso de uma assinatura de nome forte como um validador de segurança para confiar no código de terceiros. Microsoft Authenticode é a maneira recomendada de autenticar código.

Limitações dos nomes fortes convencionais

A forte tecnologia de nomenclatura usada em versões anteriores ao .NET Framework 4.5 tem as seguintes deficiências:

  • As chaves estão constantemente sob ataque, e técnicas e hardware aprimorados facilitam a inferência de uma chave privada a partir de uma chave pública. Para se proteger contra ataques, chaves maiores são necessárias. As versões do .NET Framework anteriores ao .NET Framework 4.5 fornecem a capacidade de assinar com qualquer chave de tamanho (o tamanho padrão é 1024 bits), mas assinar um assembly com uma nova chave quebra todos os binários que fazem referência à identidade mais antiga do assembly. Portanto, é extremamente difícil atualizar o tamanho de uma chave de assinatura se você quiser manter a compatibilidade.

  • A assinatura de nome forte suporta apenas o algoritmo SHA-1. O SHA-1 foi recentemente considerado inadequado para aplicações de hashing seguras. Portanto, um algoritmo mais forte (SHA-256 ou superior) é necessário. É possível que o SHA-1 perca sua posição de compatível com FIPS, o que apresentaria problemas para aqueles que optam por usar apenas software e algoritmos compatíveis com FIPS.

Vantagens de nomes fortes aprimorados

As principais vantagens dos nomes fortes melhorados são a compatibilidade com nomes fortes pré-existentes e a capacidade de afirmar que uma identidade é equivalente a outra:

  • Os desenvolvedores que têm assemblies assinados pré-existentes podem migrar suas identidades para os algoritmos SHA-2, mantendo a compatibilidade com assemblies que fazem referência às identidades antigas.

  • Os desenvolvedores que criam novos assemblies e não estão preocupados com assinaturas de nomes fortes pré-existentes podem usar os algoritmos SHA-2 mais seguros e assinar os assemblies como sempre fizeram.

Usar nomes fortes aprimorados

As chaves de nome fortes consistem em uma chave de assinatura e uma chave de identidade. O assembly é assinado com a chave de assinatura e é identificado pela chave de identidade. Antes do .NET Framework 4.5, essas duas chaves eram idênticas. A partir do .NET Framework 4.5, a chave de identidade permanece a mesma que nas versões anteriores do .NET Framework, mas a chave de assinatura é aprimorada com um algoritmo de hash mais forte. Além disso, a chave de assinatura é assinada com a chave de identidade para criar uma contraassinatura.

O AssemblySignatureKeyAttribute atributo permite que os metadados do assembly usem a chave pública pré-existente para a identidade do assembly, o que permite que as referências de assembly antigas continuem a funcionar. O AssemblySignatureKeyAttribute atributo usa a contraassinatura para garantir que o proprietário da nova chave de assinatura também seja o proprietário da chave de identidade antiga.

Assine com SHA-2, sem migração de chaves

Execute os seguintes comandos em um prompt de comando para assinar um assembly sem migrar uma assinatura de nome forte:

  1. Gere a nova chave de identidade (se necessário).

    sn -k IdentityKey.snk  
    
  2. Extraia a chave pública de identidade e especifique que um algoritmo SHA-2 deve ser usado ao assinar com essa chave.

    sn -p IdentityKey.snk IdentityPubKey.snk sha256  
    
  3. Atrase a assinatura do assembly com o arquivo de chave pública de identidade.

    csc MyAssembly.cs /keyfile:IdentityPubKey.snk /delaySign+  
    
  4. Assine novamente o assembly com o par de chaves de identidade completo.

    sn -Ra MyAssembly.exe IdentityKey.snk  
    

Assine com SHA-2, com migração de chaves

Execute os seguintes comandos em um prompt de comando para assinar um assembly com uma assinatura de nome forte migrada.

  1. Gere um par de chaves de identidade e assinatura (se necessário).

    sn -k IdentityKey.snk  
    sn -k SignatureKey.snk  
    
  2. Extraia a chave pública de assinatura e especifique que um algoritmo SHA-2 deve ser usado ao assinar com essa chave.

    sn -p SignatureKey.snk SignaturePubKey.snk sha256  
    
  3. Extraia a chave pública de identidade, que determina o algoritmo de hash que gera uma contraassinatura.

    sn -p IdentityKey.snk IdentityPubKey.snk  
    
  4. Gere os parâmetros para um AssemblySignatureKeyAttribute atributo e anexe o atributo ao assembly.

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

    Isso produz resultados semelhantes aos seguintes.

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

    Essa saída pode ser transformada em um AssemblySignatureKeyAttribute.

    [assembly:System.Reflection.AssemblySignatureKeyAttribute(
    "002400000c80000094000000060200000024000052534131000400000100010005a3a81ac0a519d96244a9c589fc147c7d403e40ccf184fc290bdd06c7339389a76b738e255a2bce1d56c3e7e936e4fc87d45adc82ca94c716b50a65d39d373eea033919a613e4341c66863cb2dc622bcb541762b43893434d219d1c43f07e9c83fada2aed400b9f6e44ff05e3ecde6c2827830b8f43f7ac8e3270a34d153cdd",
    "e3cf7c211678c4d1a7b8fb20276c894ab74c29f0b5a34de4d61e63d4a997222f78cdcbfe4c91ebe1ddf9f3505a32edcb2a76f34df0450c4f61e376b70fa3cdeb7374b1b8e2078b121e2ee6e8c6a8ed661cc35621b4af53ac29c9e41738f199a81240e8fd478c887d1a30729d34e954a97cddce66e3ae5fec2c682e57b7442738"
    )]
    
  5. Assine o assembly com a chave pública de identidade.

    csc MyAssembly.cs /keyfile:IdentityPubKey.snk /delaySign+  
    
  6. Assine totalmente o assembly com o par de chaves de assinatura.

    sn -Ra MyAssembly.exe SignatureKey.snk  
    

Consulte também