C #: perché firmare un assembly?


146

In alcuni codici C # che ho acquisito (in Visual Studio 2005), ho notato che gli assembly sono tutti firmati con lo stesso .snkfile.

  • Perché l'autore precedente avrebbe firmato le assemblee in questo modo?
  • La firma degli assiemi è necessaria e cosa sarebbe sbagliato se non si firmasse?
  • Quali sono gli svantaggi nella firma degli assiemi? Provoca ritardi?

Risposte:


186

Perché l'autore precedente avrebbe firmato le assemblee in questo modo?

Nessuna idea, forse voleva che tutte le sue assemblee fossero firmate con la stessa chiave.

È necessario firmare assemblee e cosa sarebbe sbagliato non firmarlo?

No, non è necessario ma è un meccanismo che consente di garantire l'autenticità di un assieme. Ti consente di garantire che un assieme non sia stato manomesso e che provenga da questo autore. È anche necessario se si desidera inserirli nel GAC.

Quali sono gli svantaggi nella firma degli assiemi? Provoca ritardi?

Gli assembly firmati possono caricare solo altri assembly firmati. Inoltre, sono collegati a una versione specifica, il che significa che è necessario utilizzare reindirizzamenti vincolanti o ricompilare l'applicazione se si desidera utilizzare una versione diversa. C'è anche un piccolo sovraccarico di prestazioni dovuto alla verifica della firma, ma è così piccolo che non dovresti preoccuparti.


2
Si noti che la verifica delle firme non ha più luogo (a partire da .NET 2.0) quando viene inserita in GAC; succede solo una volta, quando lo si aggiunge al GAC .
Abele,

1
Cosa ne pensi della firma al giorno d'oggi? Su sistemi basati sul web? Se ho ragione, era necessario solo quando si parla di software installati, giusto? Se pubblico la mia app in Azure usando TFS, so che non è stata manomessa, giusto? O mi manca qualche parte di sicurezza?
Rick Wolff,

Sulla prima domanda: ha creato un modello di progetto da un progetto che aveva un file chiave della firma dell'assembly, quindi ha utilizzato quel modello di progetto per creare un altro elemento e si è dimenticato di sostituire il file chiave. (basta sostituire "lui" con "io" e sai cosa stavo facendo stamattina :)). Quindi è accidentale.
hardyVeles,

33

È necessario firmare gli assiemi se si desidera inserirli nel GAC .

Se firmi un eseguibile, anche tutte le librerie di classi a cui si collega devono essere firmate. Questo può essere difficile se stai usando una libreria di terze parti (specialmente se devi usare un controllo ActiveX o simile).

Richard Grimes ha scritto un buon seminario sulla sicurezza in .NET e che include un capitolo su questo: Security Workshop

Il motivo per cui tutti gli assembly sono stati firmati con lo stesso file .snk potrebbe essere se ha utilizzato i test unitari con copertura del codice. Per poter eseguire la copertura del codice (almeno con gli strumenti integrati nella versione di prova di Visual Studio 2005) e se gli assembly sono firmati, è necessario specificare quali file .snk vengono utilizzati per la firma, ma penso che si possa solo specifica un file .snk per l'intera soluzione, quindi se firmi le varie librerie di classi con diversi file .snk puoi controllare la copertura del codice su una di esse alla volta.


17

Un motivo molto importante per firmare un assembly è che puoi essere sicuro che sia il tuo assembly. Poiché la chiave privata è tua, nessun altro può firmare un assembly con la stessa chiave. Ciò significa che quando la chiave pubblica di un assembly è quella che conosci (puoi recuperarla utilizzando la GetType().Assembly.GetName().GetPublicKey()funzione), l'assembly è tuo e non è stato manomesso.


1

Nonostante tutti gli usi della firma dll, la dll dovrebbe essere firmata solo per due motivi

1. Controllo delle versioni

2. Autenticazione

un. Il versioning indica su quale versione è stata creata la dll e mentre è possibile inserirle in GAC possono esistere due dll con lo stesso nome ma versione diversa

b. L'autenticazione indica se la dll non è manomessa ed esiste allo stesso modo quando è stata creata.

Se vuoi saperne di più sulle basi e sulla firma dll puoi fare riferimento qui


1
Cosa ne pensi della firma al giorno d'oggi? Su sistemi basati sul web? Se ho ragione, era necessario solo quando si parla di software installati, giusto? Se pubblico la mia app in Azure usando TFS, so che non è stata manomessa, giusto? O mi manca qualche parte di sicurezza?
Rick Wolff,

1
Non vedo un motivo per cui dovremmo firmare una DLL ora un giorno, che verrà implementata come soluzione Paas in azzurro. Ma se stai avendo una soluzione iaas, potresti riutilizzare la dll dall'applicazione web nella stessa IIS. Che non consiglio. dovremmo chiamarli tramite api url, piuttosto che usare quelle dll di GAC (architettura microservizi).
Karthikeyan VK,

1

Oltre alle risposte esistenti, aggiungerei che è necessario utilizzare la firma quando la DLL verrà caricata e consumata in modo dinamico da software di terze parti. Non è un requisito tecnico di per sé, ma è razionale, quindi molto comune, che il produttore di software di terze parti imponga tale politica per motivi di sicurezza.

Esempi in cui è necessario firmare un assembly:

  • sviluppo dell'estensione Shell di Windows / Esplora risorse, come: estensione del menu di scelta rapida per Esplora risorse
  • sviluppo di estensioni di Visual Studio, come ad esempio: GUI della procedura guidata per modello di progetto / elemento

0

La firma e l'assemblaggio sono importanti. Al fine di garantire che exe o assembly sia installato solo su quel PC.

Vale a dire: se copi quella cartella e la metti in un altro PC, non funziona. poiché sta firmando quell'assemblaggio solo su quella macchina.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.