Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
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). Esta assinatura é usada como uma identidade exclusiva para uma montagem e garante que as referências à montagem não sejam ambíguas. O conjunto é assinado como parte do processo de compilação e depois verificado quando é carregado.
Assinaturas de nomes fortes ajudam a evitar que partes mal-intencionadas adulterem um conjunto e, em seguida, o voltem a assinar 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 o assembly nem indica se essa pessoa era um titular legítimo da chave; apenas indica 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 programadores que têm conjuntos de assemblies assinados pré-existentes podem migrar as suas identidades para os algoritmos SHA-2, enquanto mantêm a compatibilidade com assemblies que referenciam as 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 de costume.
Usar nomes fortes aprimorados
As chaves de nome fortes consistem em uma chave de assinatura e uma chave de identidade. A montagem é assinada com a chave de assinatura e identificada com a 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 num prompt de comando para assinar um assembly sem migrar uma assinatura de nome forte.
Gere a nova chave de identidade (se necessário).
sn -k IdentityKey.snk
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
Assine parcialmente o assembly com o ficheiro de chave pública de identidade.
csc MyAssembly.cs /keyfile:IdentityPubKey.snk /delaySign+
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.
Gere um par de chaves de identidade e assinatura (se necessário).
sn -k IdentityKey.snk sn -k SignatureKey.snk
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
Extraia a chave pública de identidade, que determina o algoritmo de hash que gera uma contraassinatura.
sn -p IdentityKey.snk IdentityPubKey.snk
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
Esta saída pode ser transformada numa AssemblySignatureKeyAttribute.
[assembly:System.Reflection.AssemblySignatureKeyAttribute( "002400000c80000094000000060200000024000052534131000400000100010005a3a81ac0a519d96244a9c589fc147c7d403e40ccf184fc290bdd06c7339389a76b738e255a2bce1d56c3e7e936e4fc87d45adc82ca94c716b50a65d39d373eea033919a613e4341c66863cb2dc622bcb541762b43893434d219d1c43f07e9c83fada2aed400b9f6e44ff05e3ecde6c2827830b8f43f7ac8e3270a34d153cdd", "e3cf7c211678c4d1a7b8fb20276c894ab74c29f0b5a34de4d61e63d4a997222f78cdcbfe4c91ebe1ddf9f3505a32edcb2a76f34df0450c4f61e376b70fa3cdeb7374b1b8e2078b121e2ee6e8c6a8ed661cc35621b4af53ac29c9e41738f199a81240e8fd478c887d1a30729d34e954a97cddce66e3ae5fec2c682e57b7442738" )]
Assine adiadamente a assembly com a chave pública de identidade.
csc MyAssembly.cs /keyfile:IdentityPubKey.snk /delaySign+
Assine totalmente o conjunto com o par de chaves de assinatura.
sn -Ra MyAssembly.exe SignatureKey.snk