2009-07-28 23 views
90

Uno de mis colegas está muy interesado en la firma de asambleas. Literalmente intenta firmar cualquier cosa. Incluso cuando utilizamos ensamblajes de Microsoft que no están firmados, él tomará el código fuente, lo firmará y luego pedirá a otros desarrolladores que usen su copia.¿Hay algún problema con NO firmar un ensamblado de .NET?

Entiendo la idea básica detrás de la firma de un ensamblaje: garantizar que un ensamblado en particular no se vea comprometido por un hacker poco fiable. Entonces, si somos una empresa de desarrollo de software, debemos firmar nuestro ensamblaje antes de lanzar una biblioteca .NET a nuestros clientes.

Sin embargo, principalmente desarrollamos aplicaciones web para nuestro propio uso aquí, y simplemente no puedo ver el punto de firmar cada ensamblaje que usamos.

¿Falta algo aquí?

+1

Vale la pena mencionar algunas confusiones aquí, "firmas digitales" (que tienen un propósito de seguridad) y "Asambleas fuertemente nombradas" que son una solución para el infierno y ayudan al GAC a vincularse a las bibliotecas. Usar uno u otro es similar y se puede hablar de ambos en términos de firmar un ensamblaje. Parece que algunos carteles están pensando en uno y otros están pensando en otro o en ambos. – amalgamate

Respuesta

47

Los ensamblajes de firma que se usan dentro de un entorno de confianza me parecen excesivos.

Un punto interesante en ensambles con signo es que son un poco más lentos de cargar que los ensambles sin firmar, ya que deben ser verificados criptográficamente.

Para firmar un ensamblaje, cualquier ensamblaje del que dependa también debe estar firmado. Supongo que esto contribuye al deseo de su colega de firmar todo, el compilador lo exige.


EDITAR Después de haber escrito esta respuesta se puede ver tanto los pros y los contra de campo tiene el apoyo más o menos equivalente. Claramente no hay una respuesta correcta aquí.

El punto que obligó a esta edición es que hoy en día tomamos tantas librerías de código abierto de NuGet, y muchas de ellas no están firmadas en absoluto. Si desea firmar su ensamblaje, debe tener también dependencias firmadas. Muchas de las bibliotecas de código abierto que se firman tienen las claves privadas utilizadas para firmar públicamente disponibles en sus repositorios de origen.

Como con todo, hay que hacer concesiones. En mi experiencia de trabajo en entornos privados, los beneficios de la firma son en su mayoría teóricos (o académicos, como @user289100 menciones), a menos que te preocupen las agencias gubernamentales que modifiquen tu código, en cuyo caso necesitas ser paranoico sobre tantos niveles de tu infraestructura que la firma parecería una pequeña cantidad de esfuerzo. De lo contrario, la cantidad de desafíos que caen en cascada al tener que firmar todo simplemente no parece valer la pena. Sin embargo, su entorno puede tener diferentes requisitos o puede ser un masoquista.

Consulte también Teun D's answer para obtener información sobre los desafíos relacionados con los ensamblados de versión al usar nombres seguros.

+17

De acuerdo, es como una adicción al crack ahora – Janie

+3

Un punto más a tener en cuenta es que si desea compartir este ensamblado en diferentes aplicaciones, entonces la firma es imprescindible (es decir, GAC). –

3

Estoy de acuerdo, parece un desperdicio. Es realmente necesario para garantizar que el archivo sea lo que piensas que es (y no ha sido alterado). Pero si confía en los confines de su propia red de seguridad y servidor web, la firma de sus ensamblados web parece un paso redundante.

Pero quizás esa es mi pequeña experiencia de negocios hablando. Si está hablando de un sitio web de banca en línea crítico para la misión, entonces registrese.

9

¿Su colega le ha dado alguna indicación con respecto a por qué le gusta firmar montajes? Una ventaja de la firma que aún no se ha discutido aquí es que solo las asambleas firmadas se pueden colocar en el GAC (es decir,ser compartido a través de los procesos gestionados), pero las desventajas parecen superar las ventajas desde mi perspectiva (ciertamente inexperimentada).

Su anécdota sobre la autofirma del código de Microsoft me parece especialmente sospechosa. Si MS no firmó el código, probablemente haya una razón, ¿no? Y al firmarlo, asumes la responsabilidad cuando no lo escribiste, otra oportunidad para que el futuro te muerda.

+2

En realidad, no estoy seguro de por qué pero Microsoft ciertamente no firmó Enterprise Library 3.1 – oscarkuo

+1

¿Por qué compartir un ensamblaje entre procesos requiere que el ensamblaje esté en el GAC? –

+4

No es que no pueda compartir referencias de tiempo de ejecución para el mismo .dll, sino que solo los ensamblados con nombres fuertes (es decir, firmados) pueden entrar en el GAC, y los ensamblados se colocan en el GAC para que puedan compartirse. –

4

Otra cosa sobre la firma de un ensamblaje es que uno no puede inyectar uno incorrecto en lugar del suyo (también usted mismo por un accidente). Por ejemplo, si crea un programa que hace referencia a un ensamblado Foo.dll, versión 1.0, alguien puede crear un ensamblado, con la misma versión y reemplazar el suyo, cuando firme su biblioteca, no será posible (en al menos no creo que sea fácilmente posible).

4

Las firmas solo son necesarias si los ensamblajes se colocan en el GAC, nada más. Los ensamblajes con signo no impiden que alguien se meta con ellos. Un hacker aún puede quitar la firma y cualquier otro código que verifique la firma.

+2

Para una aplicación web, el pirata informático también debería modificar el archivo web.config. – Tangurena

+3

Si un hacker puede eliminar firmas de un ensamblado, el web.config tampoco las detendrá. – ZippyV

+4

Se recomienda a los Downvoters leer http://ianpicknell.blogspot.com/2010/02/tampering-with-strong-named-assembly.html y artículos similares vinculados a partir de ese. – Constantin

2

Piense en hacerlo si va a enviar algo y/o realmente tiene un motivo para hacerlo. En cualquier otro caso, es solo una molestia. Le preguntaría a tu compañero de trabajo qué es lo que realmente consigue al hacer esto.

Me he encontrado ensamblado-itis antes y es un dolor en la parte posterior, especialmente cuando se considera la cantidad de personas que tienen poco o ningún conocimiento de cómo ensamblar ensamblajes, para qué sirve y cómo hacerlo. Es solo otra cosa con la que no deberías preocuparte a menos que sea absolutamente necesario.

38

Un punto adicional: la firma de sus ensamblajes rompe la compatibilidad con versiones anteriores. Todas sus referencias comienzan a incluir números de versión y las versiones con otros números de versión se consideran no compatibles. Esto dificulta la actualización a versiones más nuevas de ensambles distribuidos.

En mi opinión, se debe únicamente unidades de código de signo si ve algún beneficio concreto de ella:

  • si se implementa en entornos en los que las personas no confiables podrían tocar sus asambleas
  • en ciertos plug-in modelos, donde desea utilizar el certificado como evidencia para actualizar la confianza
  • si su código debe poder llamarse desde otro código firmado (un proyecto como, por ejemplo, log4net, justificadamente firma su código para que sea ampliamente utilizable; se equivocaron enormemente en compatibilidad al perder su clave secreta hace unos años, otro riesgo de firma de código).
  • si desea implementar en la GAC ​​
59

que he tomado ventaja de las asambleas no firmado para moverse por cuestiones antes y en el ámbito académico mostrado a la gente por qué es importante. Reemplacé un archivo DLL que no estaba firmado (de nuevo en un entorno académico) con uno que hice con el mismo nombre, mismas firmas, y usé .NET Reflector para copiar y pegar el código original, pero en el mío envié un correo electrónico con nombres de usuario y contraseñas que estaban siendo pasó antes de llamar al código 'real'.

Si está firmado, puede hacer una coincidencia de firma, pero no reemplazar. Al contrario de lo que dice Zippy, habrá un error de compilación en tiempo de ejecución.

Firmar ensamblajes nunca es exagerado. Tarda 30 segundos. Es como decir que cerrar las puertas es excesivo si vives en el campo. Si quieres apostar tus pertenencias, adelante, déjala abierta. Solo se necesita una violación de seguridad para ser despedido.Solo se requieren 30 segundos para firmar un ensamblaje y no hay ningún caso empresarial que no lo haga. El impacto en el rendimiento es insignificante.

+11

Si un hacker puede cambiar el dll, también puede cambiar la aplicación que llama al dll. – ZippyV

+12

Correcto, pero sin tener la clave para firmar la aplicación, tendrán dificultades para ejecutar la aplicación en un entorno donde solo se permite ejecutar la versión firmada de la aplicación original, que sería el caso en varios entornos en los que he trabajado. Su falta del bosque por los árboles: no firmar un ensamblaje implica asumir un riesgo de seguridad innecesario que toma 30 segundos evitar y no hay casos de negocios ni casos del mundo real que haya visto en mi vida. no firmar un ensamblaje – user289100

1

Debe firmar su ensamblaje cuando se utiliza en un deploy-from-the-web ClickOnceXBAP.

Además, todos los ensambles a los que se hace referencia deberán firmarse también.

1

Firmamos nuestras asambleas, porque hay momentos cuando tenemos errores como el siguiente (ésta es de prueba, pero puede ocurrir cuando se ejecuta la aplicación):

System.IO.FileLoadException : Could not load file or assembly 'Latitude.Platform.Core, Version=1.0.5871.22518, Culture=neutral, PublicKeyToken=7926214d13e12325' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040) 

TearDown : System.IO.FileLoadException : Could not load file or assembly 'Latitude.Platform.Core, Version=1.0.5871.22518, Culture=neutral, PublicKeyToken=7926214d13e12325' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040) 

Habíamos descubierto que Visual Studio se equivoca a veces y ejecuta el código anterior.

Si desea un error si está ejecutando código antiguo, firme sus ensamblajes.

Si está escribiendo un paquete de Nuget, firme sus ensamblajes. Los ensambles sin firma son incómodos para nosotros que queremos asegurarnos de que estamos ejecutando la última versión de nuestro código. No puedo reparar Visual Studio. Todo lo que puedo hacer es detectar que Visual Studio se equivocó. Así que, por favor, firme sus conjuntos nuget.

+0

Veo que su punto está más relacionado con la versión de ensamblaje en lugar de con la firma. –

Cuestiones relacionadas