Denominazione sicura avanzataEnhanced Strong Naming

Una firma con nome sicuro è un meccanismo di identità in .NET Framework per l'identificazione degli assembly.A strong name signature is an identity mechanism in the .NET Framework for identifying assemblies. È una firma digitale a chiave pubblica che in genere si usa per verificare l'integrità dei dati passati da un autore (firmatario) a un destinatario (verificatore).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). Questa firma viene usata come identità univoca per un assembly e garantisce che i riferimenti all'assembly non siano ambigui.This signature is used as a unique identity for an assembly and ensures that references to the assembly are not ambiguous. L'assembly è firmato come parte del processo di compilazione e quindi verificato quando viene caricato.The assembly is signed as part of the build process and then verified when it is loaded.

Le firme con nome sicuro consentono di evitare che utenti malintenzionati possano manomettere un assembly e firmarlo nuovamente con la chiave del firmatario originale.Strong name signatures help prevent malicious parties from tampering with an assembly and then re-signing the assembly with the original signer’s key. Tuttavia, le chiavi con nome sicuro non contengono informazioni affidabili sul server di pubblicazione e non contengono una gerarchia di certificati.However, strong name keys don’t contain any reliable information about the publisher, nor do they contain a certificate hierarchy. Una firma con nome sicuro non garantisce l'affidabilità della persona che ha firmato l'assembly né indica se la persona è un legittimo proprietario della chiave, indica solo che il proprietario della chiave ha firmato l'assembly.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. Di conseguenza, non è consigliabile usare una firma con nome sicuro come validator di sicurezza per concedere l'attendibilità a codice di terze parti.Therefore, we do not recommend using a strong name signature as a security validator for trusting third-party code. Microsoft Authenticode è lo strumento consigliato per l'autenticazione di codice.Microsoft Authenticode is the recommended way to authenticate code.

Limitazioni dei nomi sicuri convenzionaliLimitations of Conventional Strong Names

La tecnologia di denominazione sicura usata nelle versioni precedenti a .NET Framework 4.5.NET Framework 4.5 presenta queste limitazioni:The strong naming technology used in versions before the .NET Framework 4.5.NET Framework 4.5 has the following shortcomings:

  • Le chiavi sono costantemente sotto attacco e grazie all'uso di tecniche e hardware più evoluti è più semplice dedurre una chiave privata da una chiave pubblica.Keys are constantly under attack, and improved techniques and hardware make it easier to infer a private key from a public key. Per proteggersi dagli attacchi, sono necessarie chiavi di dimensioni maggiori.To guard against attacks, larger keys are necessary. Le versioni di .NET Framework precedenti alla .NET Framework 4.5.NET Framework 4.5 offrono la possibilità di accedere con chiavi di qualsiasi dimensione (quella predefinita è 1024 bit), ma firmare un assembly con una nuova chiave interrompe tutti i file binari che fanno riferimento all'identità precedente dell'assembly..NET Framework versions before the .NET Framework 4.5.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. È quindi estremamente difficile aggiornare la dimensione di una chiave di firma se si vuole mantenere la compatibilità.Therefore, it is extremely difficult to upgrade the size of a signing key if you want to maintain compatibility.

  • La firma con nome sicuro supporta solo l'algoritmo SHA-1.Strong name signing supports only the SHA-1 algorithm. Si è scoperto di recente che SHA-1 non è adeguato per le applicazioni che usano l'algoritmo SHA.SHA-1 has recently been found to be inadequate for secure hashing applications. È quindi necessario un algoritmo più robusto, ad esempio SHA-256 o superiore.Therefore, a stronger algorithm (SHA-256 or greater) is necessary. È possibile che in futuro SHA-1 non sia più conforme agli standard FIPS e questo può causare problemi agli utenti che scelgono di usare solo software e algoritmi conformi agli standard 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.

Vantaggi dei nomi sicuri avanzatiAdvantages of Enhanced Strong Names

I vantaggi principali offerti dai nomi sicuri avanzati sono la compatibilità con nomi sicuri preesistenti e la possibilità di richiedere che un'identità sia equivalente a un'altra: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:

  • Gli sviluppatori che usano assembly firmati preesistenti possono eseguire la migrazione delle proprie identità agli algoritmi SHA-2 conservando la compatibilità con gli assembly che fanno riferimento alle identità precedenti.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.

  • Gli sviluppatori che creano nuovi assembly e non ritengono rilevanti le firme con nome sicuro preesistenti possono usare gli algoritmi SHA-2, più sicuri, e firmare gli assembly come in precedenza.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.

Uso dei nomi sicuri avanzatiUsing Enhanced Strong Names

Le chiavi con nome sicuro sono costituite da una chiave di firma e una chiave di identità.Strong name keys consist of a signature key and an identity key. L'assembly è firmato con la chiave di firma e identificato dalla chiave di identità.The assembly is signed with the signature key and is identified by the identity key. Prima della versione .NET Framework 4.5.NET Framework 4.5 queste due chiavi erano identiche.Prior to the .NET Framework 4.5.NET Framework 4.5, these two keys were identical. A partire da .NET Framework 4.5.NET Framework 4.5, la chiave di identità rimane la stessa come nelle versioni precedenti di .NET Framework, ma la chiave di firma è stata migliorata con un algoritmo hash più avanzato.Starting with the .NET Framework 4.5.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. Inoltre, la chiave di firma viene firmata con la chiave di identità per creare una controfirma.In addition, the signature key is signed with the identity key to create a counter-signature.

L'attributo AssemblySignatureKeyAttribute consente ai metadati dell'assembly di usare la chiave pubblica preesistente per l'identità dell'assembly e quindi i vecchi riferimenti all'assembly continuano a funzionare.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. L'attributo AssemblySignatureKeyAttribute usa la controfirma per verificare che il proprietario della nuova chiave di firma sia anche il proprietario della chiave di identità precedente.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.

Firma con SHA-2, senza migrazione delle chiaviSigning with SHA-2, Without Key Migration

Eseguire i comandi seguenti da una finestra del prompt dei comandi per firmare un assembly senza eseguire la migrazione di una firma con nome sicuro:Run the following commands from a Command Prompt window to sign an assembly without migrating a strong name signature:

  1. Generare la nuova chiave di identità, se necessario.Generate the new identity key (if necessary).

    sn -k IdentityKey.snk  
    
  2. Estrarre la chiave pubblica di identità e specificare che deve essere usato un algoritmo SHA-2 per la firma con questa chiave.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. Ritardare la firma dell'assembly con il file della chiave pubblica di identità.Delay-sign the assembly with the identity public key file.

    csc MyAssembly.cs /keyfile:IdentityPubKey.snk /delaySign+  
    
  4. Firmare di nuovo l'assembly con la coppia di chiavi di identità completa.Re-sign the assembly with the full identity key pair.

    sn -Ra MyAssembly.exe IdentityKey.snk  
    

Firma con SHA-2, con migrazione delle chiaviSigning with SHA-2, with Key Migration

Eseguire i comandi seguenti da una finestra del prompt dei comandi per firmare un assembly con una firma con nome sicuro migrata.Run the following commands from a Command Prompt window to sign an assembly with a migrated strong name signature.

  1. Generare una coppia di chiavi di identità e firma, se necessario.Generate an identity and signature key pair (if necessary).

    sn -k IdentityKey.snk  
    sn -k SignatureKey.snk  
    
  2. Estrarre la chiave pubblica di firma e specificare che deve essere usato un algoritmo SHA-2 per la firma con questa chiave.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. Estrarre la chiave pubblica di identità, che determina l'algoritmo hash che genera una controfirma.Extract the identity public key, which determines the hash algorithm that generates a counter-signature.

    sn -p IdentityKey.snk IdentityPubKey.snk  
    
  4. Generare i parametri per un attributo AssemblySignatureKeyAttribute e allegare l'attributo all'assembly.Generate the parameters for a AssemblySignatureKeyAttribute attribute, and attach the attribute to the assembly.

    sn -ac IdentityPubKey.snk IdentityKey.snk SignaturePubKey.snk  
    
  5. Ritardare la firma dell'assembly con la chiave pubblica di identità.Delay-sign the assembly with the identity public key.

    csc MyAssembly.cs /keyfile:IdentityPubKey.snk /delaySign+  
    
  6. Firmare completamente l'assembly con la coppia di chiavi di firma.Fully sign the assembly with the signature key pair.

    sn -Ra MyAssembly.exe SignatureKey.snk  
    

Vedere ancheSee Also

Creazione e utilizzo degli assembly con nome sicuroCreating and Using Strong-Named Assemblies