C #: por que assinar um assembly?


146

Em algum código C # que eu assumi (no Visual Studio 2005), notei que os assemblies são todos assinados com o mesmo .snkarquivo.

  • Por que o autor anterior assinou as assembléias dessa maneira?
  • É necessário assinar assembléias e o que há de errado em não assinar?
  • Que desvantagens existem na assinatura de assembléias - isso causa atrasos?

Respostas:


186

Por que o autor anterior assinou as assembléias dessa maneira?

Não faço ideia, talvez ele quisesse que todas as suas assembléias fossem assinadas com a mesma chave.

É necessário assinar assembléias e o que há de errado em não assiná-lo?

Não, não é necessário, mas é um mecanismo que permite garantir a autenticidade de uma montagem. Ele permite garantir que uma montagem não tenha sido violada e, de fato, é originária deste autor. Também é necessário se você deseja colocá-los no GAC.

Que desvantagens existem na assinatura de assembléias - isso causa atrasos?

Assemblies assinados podem carregar apenas outros assemblies assinados. Além disso, eles estão vinculados a uma versão específica, o que significa que você precisa usar redirecionamentos de ligação ou recompilar o aplicativo se desejar usar uma versão diferente. Também há um pouco de sobrecarga de desempenho devido à verificação da assinatura, mas é tão pouco que você não deveria se preocupar.


2
Observe que a verificação de assinaturas não ocorre mais (desde o .NET 2.0) quando colocada no GAC; isso acontece apenas uma vez, ao adicioná-lo ao GAC .
Abel

1
O que você acha de assiná-lo hoje em dia? Em sistemas baseados na web? Se estou certo, só foi necessário falar de softwares instalados, certo? Se eu publicar meu aplicativo no Azure usando o TFS, sei que ele não foi adulterado, certo? Ou estou faltando alguma parte de segurança?
Rick Wolff

Na primeira pergunta: ele criou o Modelo de Projeto a partir de um projeto que possuía um arquivo de chave de assinatura de montagem, depois usou esse Modelo de Projeto para criar outro material e esqueceu de substituir o arquivo de chave. (apenas substitua "ele" por "eu" e você sabe o que eu estava fazendo esta manhã :)). Então, é acidental.
hardyVeles

33

Você precisa assinar assembléias se quiser colocá-las no GAC .

Se você assinar um executável, todas as bibliotecas de classes às quais ele vincula também precisam ser assinadas. Isso pode ser difícil se você estiver usando uma biblioteca de terceiros (especialmente se precisar usar um controle ActiveX ou semelhante).

Richard Grimes escreveu um bom workshop sobre segurança no .NET e inclui um capítulo sobre isso: Workshop de Segurança

O motivo de todos os assemblies serem assinados com o mesmo arquivo .snk poderia ser se ele usasse o teste de unidade com cobertura de código. Para poder fazer a cobertura do código (pelo menos com as ferramentas incorporadas à versão de teste do Visual Studio 2005) e se os assemblies estiverem assinados, você precisará especificar quais arquivos .snk serão usados ​​para a assinatura, mas acho que você pode apenas especifique um arquivo .snk para toda a solução; portanto, se você assinar as várias bibliotecas de classes com arquivos .snk diferentes, poderá verificar apenas a cobertura do código em um deles por vez.


17

Um motivo muito importante para assinar uma montagem é para ter certeza de que é a sua montagem. Como a chave privada é sua, ninguém mais pode assinar um assembly com a mesma chave. Isso significa que quando a chave pública de um assembly é uma que você conhece (você pode recuperá-lo usando a GetType().Assembly.GetName().GetPublicKey()função), o assembly é seu e não foi adulterado.


1

Apesar de todos os usos de assinar dll, a dll deve ser assinada por apenas dois motivos

1. Controle de versão

2. Autenticação

uma. O controle de versão denota em qual versão a dll foi criada e, ao mesmo tempo em que é empurrada para o GAC, podem existir duas dll com o mesmo nome, mas uma versão diferente

b. A autenticação indica se a dll não é violada e existe a mesma quando foi criada.

Se você quiser entender mais sobre o básico e a assinatura da DLL, consulte aqui


1
O que você acha de assiná-lo hoje em dia? Em sistemas baseados na web? Se estou certo, só foi necessário falar de softwares instalados, certo? Se eu publicar meu aplicativo no Azure usando o TFS, sei que ele não foi adulterado, certo? Ou estou faltando alguma parte de segurança?
Rick Wolff

1
Não vejo uma razão pela qual devemos assinar uma dll hoje em dia, que será implantada como solução Paas em azul. Mas se você estiver tendo uma solução, poderá reutilizar a dll por aplicativo da web no mesmo iis. Que eu não recomendo. deveríamos chamá-los por meio de API API, em vez de usar as DLLs do GAC (arquitetura de microsserviço).
Karthikeyan VK

1

Além das respostas existentes, eu acrescentaria que você deve usar a assinatura quando sua DLL for carregada e consumida dinamicamente por software de terceiros. Não é um requisito técnico em si, mas é racional, portanto, muito comum, que o produtor de software de terceiros imponha essa política devido a preocupações de segurança.

Exemplos em que você deve assinar uma montagem:

  • desenvolvimento da extensão Windows Shell / Windows Explorer, como: extensão do menu de contexto para o Windows Explorer
  • desenvolvimento de extensões do Visual Studio, como: GUI do Project / Item Template Wizard

0

A assinatura e a montagem são importantes. Para garantir que o exe ou o conjunto instalado apenas nesse PC.

Ou seja: se você copiar essa pasta e colocá-la em outro PC, ela não funcionará. pois está assinando esse conjunto apenas nessa máquina.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.