¿Por qué utilizar ensamblados con nombre seguro?

107

¿Cuáles son las ventajas de utilizar ensamblados con nombre seguro?

¿Cuáles son las cosas que no se pueden hacer con un montaje normal?

desarrollador
fuente

Respuestas:

92

Permítanme enumerar los beneficios de nombrar su ensamblado de manera sólida primero:

  1. La asignación de un nombre seguro a su ensamblado le permite incluir su ensamblado en la caché de ensamblados global (GAC). Por tanto, te permite compartirlo entre múltiples aplicaciones.

  2. La nomenclatura segura garantiza un nombre exclusivo para ese ensamblado. Por lo tanto, nadie más puede usar el mismo nombre de ensamblado.

  3. El nombre seguro protege el linaje de la versión de un ensamblado. Un nombre seguro puede garantizar que nadie pueda producir una versión posterior de su ensamblado. Los usuarios de la aplicación tienen la garantía de que una versión del ensamblado que están cargando proviene del mismo editor que creó la versión con la que se creó la aplicación.

Más información sobre la nomenclatura segura de Microsoft se encuentra en Ensamblados con nombre seguro ( MSDN ).

Kyle Rosendo
fuente
1
¿Estás seguro del punto 4? Creo que tal vez este comportamiento haya cambiado recientemente. Intenté que fallara la carga de un ensamblado con un nombre fuerte modificándolo, pero se cargó sin incidentes.
Jens
19
Con respecto al # 4 eso es incorrecto. No está diseñado para proteger contra la manipulación. Consulte blogs.msdn.com/b/shawnfa/archive/2005/12/13/… para obtener más información.
Colin Bowern
1
@ RobV8R El 90% de nuestras dependencias son de código abierto, las claves privadas están en los repositorios públicos de git (según las recomendaciones de Microsoft) y están disponibles para cualquiera que las desee.
trampster
1
@ RobV8R No puede usar la palabra comprometido aquí, eso implicaría que está destinado a ser un secreto en primer lugar. Las pautas de Microsoft son que la clave privada debe mantenerse en su repositorio de fuente pública. Las claves privadas no están comprometidas, se publican intencionalmente. Dado que las claves privadas son conocidas y están destinadas a ser utilizadas por personas que modifiquen el código de fuente abierta de los proyectos principales (de lo contrario, la licencia se violaría en muchos casos), las personas que hagan esto usarían un número de versión diferente pero la misma clave, en este caso de que se requiera una redirección vinculante.
Trampster
1
@ RobV8R A lo que me refería originalmente es a que muchas personas creen que la nomenclatura sólida garantiza que su dependencia está bloqueada a una versión específica de un ensamblado, y ese simplemente no es el caso, una simple redirección de enlace puede cambiar la versión que usa siempre que lo haga fue firmado con la misma clave privada. Y como dije, las claves privadas se publican intencionalmente para la mayoría de nuestras dependencias.
Trampster
9

¿Cuáles son las cosas que no se pueden hacer con un montaje normal?

Dado que todas las discusiones que comenzaron con el surgimiento de Nuget sugirieron deshacerse por completo de los ensamblados con nombres fuertes, mi empresa lo intentó y se encontró con un cambio significativo de comportamiento en lo que respecta a la configuración de la aplicación:

Si utiliza la aplicación automática o la configuración de la aplicación de ámbito de usuario proporcionada por VisualStudio (heredando System.Configuration.ApplicationSettingsBase), un EXE con nombre fuerte creará exactamente 1 directorio dentro de% LOCALAPPDATA% llamado, por ejemplo, "YourApplication.exe_StrongName_kjsdfzsuzdfiuzgpoisdiufzsdouif" sin importar dónde esté el EXE situado.

Pero sin el nombre seguro, la ubicación (= ruta) del EXE se usará para crear un valor hash que ya difiere entre la compilación DEBUG y RELEASE, creando muchos directorios dentro de% LOCALAPPDATA% llamados como "YourApplication.exe_Url_dfg8778d6fs7g6d7f8g69sdf". Esto lo hace inutilizable para implementaciones ClickOnce donde el directorio de instalación cambia con cada actualización.

springy76
fuente
5

Me gustaría agregar que sin un nombre seguro no puede usar redireccionamientos vinculantes en archivos de configuración.

Esto no funcionará:

  <dependentAssembly>
    <assemblyIdentity name="MyAssembly.MyComponent" publicKeyToken="null" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
  </dependentAssembly>

Necesitas tener un token de clave pública

  <dependentAssembly>
    <assemblyIdentity name="MyAssembly.MyComponent" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
  </dependentAssembly>
tomasat
fuente
9
No se necesitan redireccionamientos vinculantes si no tiene un nombre seguro.
Trampster
0

Solo un ejemplo: me gustaría dar una respuesta haciendo más énfasis en la seguridad . En el caso de que creamos ensamblados con un código fuente que no queremos que sea reutilizado por un tercero pero queremos que sea comprobable, podemos firmar fuertemente un ensamblaje y hacer que los componentes internos sean visibles solo para aquellos ensamblados con el misma firma.

Ricky Youssef
fuente