C #: ¿por qué firmar una asamblea?

146

En algunos códigos C # que he asumido (en Visual Studio 2005), he notado que todos los ensambles están firmados con el mismo .snkarchivo.

  • ¿Por qué el autor anterior habría firmado las asambleas de esta manera?
  • ¿Es necesario firmar los ensamblados y qué estaría mal no firmar?
  • ¿Qué desventajas hay en la firma de ensamblajes? ¿Causa demoras?
Craig Johnston
fuente

Respuestas:

186

¿Por qué el autor anterior habría firmado las asambleas de esta manera?

No tengo idea, tal vez quería que todas sus asambleas se firmaran con la misma clave.

¿Es necesario firmar los ensamblados y cuál sería el error de no firmarlo?

No, no es necesario, pero es un mecanismo que le permite garantizar la autenticidad de un ensamblaje. Le permite asegurarse de que un ensamblaje no haya sido manipulado y, de hecho, proviene de este autor. También es necesario si desea incluirlos en el GAC.

¿Qué desventajas hay en la firma de ensamblajes? ¿Causa demoras?

Los conjuntos firmados solo pueden cargar otros conjuntos firmados. También están vinculados a una versión específica, lo que significa que debe utilizar redireccionamientos vinculantes o volver a compilar la aplicación si desea utilizar una versión diferente. También hay una pequeña sobrecarga de rendimiento debido a la verificación de la firma, pero es tan poco que no debería preocuparle.

Darin Dimitrov
fuente
2
Tenga en cuenta que la verificación de firmas ya no tiene lugar (desde .NET 2.0) cuando se coloca en GAC; solo ocurre una vez, cuando se agrega al GAC .
Abel
1
¿Qué opinas sobre firmarlo hoy en día? ¿En sistemas basados ​​en web? Si estoy en lo cierto, solo fue necesario cuando hablamos de software instalado, ¿verdad? Si publico mi aplicación en Azure usando TFS, sé que no ha sido manipulada, ¿verdad? ¿O me falta alguna parte de seguridad?
Rick Wolff
Sobre la primera pregunta: hizo una plantilla de proyecto a partir de un proyecto que tenía un archivo de clave de firma de ensamblaje, luego usó esa plantilla de proyecto para crear otras cosas y olvidó reemplazar el archivo de clave. (solo reemplaza "él" con "yo" y sabes lo que estaba haciendo esta mañana :)). Entonces, es accidental.
hardyVeles
33

Debe firmar ensamblajes si desea colocarlos en el GAC .

Si firma un ejecutable, entonces cualquier biblioteca de clases a la que se vincule también debe firmarse. Esto puede ser difícil si está utilizando una biblioteca de terceros (especialmente si necesita utilizar un control ActiveX o similar).

Richard Grimes ha escrito un buen taller sobre seguridad en .NET y eso incluye un capítulo sobre esto: Taller de seguridad

La razón por la que todos los ensamblados se firman con el mismo archivo .snk podría ser si utilizó pruebas unitarias con cobertura de código. Para poder hacer cobertura de código (al menos con las herramientas integradas en la versión de prueba de Visual Studio 2005) y si los ensambles están firmados, debe especificar qué archivos .snk se usan para la firma, pero creo que solo puede especifique un archivo .snk para toda la solución, por lo que si firma las distintas bibliotecas de clases con diferentes archivos .snk solo puede verificar la cobertura del código en una de ellas a la vez.

Hans Olsson
fuente
17

Una razón muy importante para firmar un ensamblaje es para que pueda estar seguro de que es su ensamblaje. Como la clave privada es suya, nadie más puede firmar un ensamblaje con esa misma clave. Esto significa que cuando la clave pública de un ensamblado es una que usted conoce (puede recuperarla usando la GetType().Assembly.GetName().GetPublicKey()función), el ensamblado es suyo y no ha sido manipulado.

Pieter van Ginkel
fuente
1

A pesar de todos los usos de firmar dll, el dll debe firmarse solo por dos razones

1. Versionado

2. Autenticación

a. El control de versiones indica en qué versión se ha construido el dll y, al mismo tiempo que los empuja a GAC, pueden existir dos dll con el mismo nombre pero una versión diferente

si. La autenticación indica si el dll no está alterado y si existe lo mismo cuando se creó.

Si desea comprender más sobre los conceptos básicos y la firma de dll, puede consultar aquí

Karthikeyan VK
fuente
1
¿Qué opinas sobre firmarlo hoy en día? ¿En sistemas basados ​​en web? Si estoy en lo cierto, solo fue necesario cuando hablamos de software instalado, ¿verdad? Si publico mi aplicación en Azure usando TFS, sé que no ha sido manipulada, ¿verdad? ¿O me falta alguna parte de seguridad?
Rick Wolff
1
No veo una razón por la que deberíamos firmar un dll ahora, que se implementará como solución Paas en azul. Pero si tiene una solución iaas, puede reutilizar el dll por aplicación web en el mismo iis. Lo cual no recomiendo. deberíamos llamarlos a través de una url, en lugar de usar esos dll de GAC (arquitectura de microservicios).
Karthikeyan VK
1

Además de las respuestas existentes, agregaría que debe usar la firma cuando su DLL sea cargada y consumida dinámicamente por software de terceros. No es un requisito técnico per se, pero es racional, por lo tanto, muy común, que el productor de software de terceros haga cumplir dicha política debido a preocupaciones de seguridad.

Ejemplos en los que debe firmar un ensamblaje:

  • desarrollo de la extensión Windows Shell / Windows Explorer, como: extensión del menú contextual para Windows Explorer
  • desarrollo de extensiones de Visual Studio, como: GUI de asistente de plantilla de proyecto / elemento
hardyVeles
fuente
0

La firma y el montaje son importantes. Para asegurar ese exe o ensamblado que está instalado en esa PC solamente.

Es decir: si copia esa carpeta y la coloca en otra PC, no funciona. ya que solo firma ese ensamblado en esa máquina.

Ram Kumar
fuente