Condividi tramite


Denominazione sicura avanzata

Una firma con nome sicuro è un meccanismo di identità in .NET Framework per identificare gli assembly. Si tratta di una firma digitale a chiave pubblica usata in genere per verificare l'integrità dei dati passati da un originatore (firmatario) a un destinatario (verificatore). Questa firma viene usata per fornire un'identità univoca a un assembly e garantisce che i riferimenti all'assembly non siano ambigui. L'assemblaggio viene firmato come parte del processo di compilazione e poi verificato quando viene caricato.

Le firme con nome sicuro consentono di impedire a utenti malintenzionati di manomettere un assembly e quindi di firmare nuovamente l'assembly con la chiave del firmatario originale. Tuttavia, le chiavi di nome forte non contengono informazioni affidabili sull'editore, né contengono una gerarchia di certificati. Una firma con nome sicuro non garantisce la attendibilità della persona che ha firmato l'assembly o indica se tale persona era un legittimo proprietario della chiave; indica solo che il proprietario della chiave ha firmato l'assembly. Pertanto, non è consigliabile usare una firma con nome sicuro come validator di sicurezza per considerare attendibile il codice di terze parti. Microsoft Authenticode è il modo consigliato per autenticare il codice.

Limitazioni dei nomi sicuri convenzionali

La tecnologia di denominazione avanzata usata nelle versioni precedenti a .NET Framework 4.5 presenta le carenze seguenti:

  • Le chiavi sono costantemente sotto attacco e tecniche migliorate e l'hardware rendono più semplice dedurre una chiave privata da una chiave pubblica. Per proteggersi dagli attacchi, sono necessarie chiavi più grandi. Le versioni di .NET Framework precedenti a .NET Framework 4.5 consentono di firmare con qualsiasi chiave di dimensione (le dimensioni predefinite sono 1024 bit), ma la firma di un assembly con una nuova chiave interrompe tutti i file binari che fanno riferimento all'identità precedente dell'assembly. Pertanto, è estremamente difficile aggiornare le dimensioni di una chiave di firma se si vuole mantenere la compatibilità.

  • La firma con nome sicuro supporta solo l'algoritmo SHA-1. SHA-1 è stato recentemente trovato inadeguato per le applicazioni di hashing sicuro. Pertanto, è necessario un algoritmo più avanzato (SHA-256 o versione successiva). È possibile che SHA-1 perderà la sua conformità FIPS, che presenterebbe problemi per coloro che scelgono di usare solo software e algoritmi conformi a FIPS.

Vantaggi dei nomi sicuri potenziati

I principali vantaggi dei nomi sicuri avanzati sono la compatibilità con nomi sicuri preesistenti e la possibilità di affermare che un'identità è equivalente a un'altra:

  • Gli sviluppatori che dispongono di assembly firmati preesistenti possono eseguire la migrazione delle identità agli algoritmi SHA-2 mantenendo al tempo stesso la compatibilità con gli assembly che fanno riferimento alle identità precedenti.

  • Gli sviluppatori che creano nuovi assembly e non sono interessati alle firme dei nomi sicuri preesistenti possono usare gli algoritmi SHA-2 più sicuri e firmare gli assembly come sempre.

Usare nomi sicuri avanzati

Le chiavi con nome sicuro sono costituite da una chiave di firma e da una chiave di identità. L'assemblaggio è firmato con la chiave di firma e identificato dalla chiave di identità. Prima di .NET Framework 4.5, queste due chiavi erano identiche. A partire da .NET Framework 4.5, la chiave di identità rimane invariata nelle versioni precedenti di .NET Framework, ma la chiave di firma è migliorata con un algoritmo hash più avanzato. Inoltre, la chiave di firma viene firmata con la chiave di identità per creare una controfirma.

L'attributo AssemblySignatureKeyAttribute consente ai metadati dell'assembly di usare la chiave pubblica preesistente per l'identità dell'assembly, che consente ai riferimenti di assembly precedenti di continuare a funzionare. L'attributo AssemblySignatureKeyAttribute usa la controfirma per garantire che il proprietario della nuova chiave di firma sia anche il proprietario della chiave di identità precedente.

Firmare con SHA-2, senza migrazione delle chiavi

Eseguire i comandi seguenti da un prompt dei comandi per firmare un assembly senza eseguire la migrazione di una firma con nome sicuro:

  1. Generare la nuova chiave di identità (se necessario).

    sn -k IdentityKey.snk  
    
  2. Estrarre la chiave pubblica di identità e specificare che un algoritmo SHA-2 deve essere usato durante la firma con questa chiave.

    sn -p IdentityKey.snk IdentityPubKey.snk sha256  
    
  3. Applicare una firma differita all'assembly utilizzando il file della chiave pubblica dell'identità.

    csc MyAssembly.cs /keyfile:IdentityPubKey.snk /delaySign+  
    
  4. Firmare nuovamente l'assembly con la coppia completa di chiavi di identità.

    sn -Ra MyAssembly.exe IdentityKey.snk  
    

Firmare con SHA-2, con la migrazione delle chiavi

Eseguire i comandi seguenti da un prompt dei comandi per firmare un assembly con una firma con nome sicuro migrato.

  1. Generare una coppia di chiavi di identità e firma (se necessario).

    sn -k IdentityKey.snk  
    sn -k SignatureKey.snk  
    
  2. Estrarre la chiave pubblica della firma e specificare che un algoritmo SHA-2 deve essere usato durante la firma con questa chiave.

    sn -p SignatureKey.snk SignaturePubKey.snk sha256  
    
  3. Estrarre la chiave pubblica di identità, che determina l'algoritmo hash che genera una controfirma.

    sn -p IdentityKey.snk IdentityPubKey.snk  
    
  4. Generare i parametri per un AssemblySignatureKeyAttribute attributo e associare l'attributo all'assembly.

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

    In questo modo viene generato un output simile al seguente.

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

    Questo output può quindi essere trasformato in AssemblySignatureKeyAttribute.

    [assembly:System.Reflection.AssemblySignatureKeyAttribute(
    "002400000c80000094000000060200000024000052534131000400000100010005a3a81ac0a519d96244a9c589fc147c7d403e40ccf184fc290bdd06c7339389a76b738e255a2bce1d56c3e7e936e4fc87d45adc82ca94c716b50a65d39d373eea033919a613e4341c66863cb2dc622bcb541762b43893434d219d1c43f07e9c83fada2aed400b9f6e44ff05e3ecde6c2827830b8f43f7ac8e3270a34d153cdd",
    "e3cf7c211678c4d1a7b8fb20276c894ab74c29f0b5a34de4d61e63d4a997222f78cdcbfe4c91ebe1ddf9f3505a32edcb2a76f34df0450c4f61e376b70fa3cdeb7374b1b8e2078b121e2ee6e8c6a8ed661cc35621b4af53ac29c9e41738f199a81240e8fd478c887d1a30729d34e954a97cddce66e3ae5fec2c682e57b7442738"
    )]
    
  5. Firmare l'assembly con la chiave pubblica di identità utilizzando la procedura di firma ritardata.

    csc MyAssembly.cs /keyfile:IdentityPubKey.snk /delaySign+  
    
  6. Firmare completamente l'assembly con la coppia di chiavi di firma.

    sn -Ra MyAssembly.exe SignatureKey.snk  
    

Vedere anche