¿Cuál es el papel del token de clave pública?

79

¿Cuál es el papel del token de clave pública? ¿Tiene algún papel en descifrar el hash firmado? En GAC, ¿por qué hay tantos ensamblados de Microsoft con el mismo token de clave pública?

materia de software
fuente
1
@Bombe, descifrar un hash de firma sería correcto, solo 1 error.
Henk Holterman
Ver también stackoverflow.com/q/573079/284795
Colonel Panic
Si está familiarizado con SSH o PGP, es lo que conoce como huella digital, es decir. una versión abreviada de la clave pública que es más fácil de inspeccionar a simple vista.
Coronel Panic

Respuestas:

160

¿Cuál es el papel del token de clave pública?

El token de clave pública es un número pequeño que es un "token" conveniente que representa una clave pública. Las claves públicas son bastante largas; el propósito del token de clave pública es permitirle hacer referencia a las claves sin decir la clave completa. De la misma manera, decir "El señor de los anillos" son cinco palabras que representan una novela de medio millón de palabras. Sería bastante incómodo si cada vez que quisieras hablar de ello tuvieras que decir ese medio millón de palabras.

¿Tiene algún papel en el descifrado del hash firmado?

No. El token de clave pública no contiene "información". Es solo un número que representa una clave pública. No es en sí misma una clave pública.

¿Por qué hay tantos ensamblados de Microsoft con el mismo token de clave pública?

Porque todos se firmaron con la misma clave privada, la clave privada de Microsoft, y por lo tanto, todos se verifican con la misma clave pública y, por lo tanto, todos tienen el mismo token de clave pública.

Eric Lippert
fuente
3
¡Qué respuesta tan nítida y perfecta, Eric!
Aditya Bokade
@Ammar a través del código, verifique la Assembly.FullNamepropiedad, para obtenerla a través de herramientas de línea de comando, vea esta respuesta
Scott Chamberlain
14

De Wikipedia

"El token de clave pública se utiliza para hacer que el nombre del ensamblado sea único. Por lo tanto, dos ensamblados con nombre seguro pueden tener el mismo nombre de archivo PE y, sin embargo, .NET los reconocerá como ensamblajes diferentes. El sistema de archivos de Windows (FAT32 y NTFS) solo reconoce el Nombre de archivo PE, por lo que dos ensamblados con el mismo nombre de archivo PE (pero diferente cultura, versión o token de clave pública) no pueden existir en la misma carpeta de Windows. Para resolver este problema, .NET presenta algo llamado GAC (Global Assembly Cache) que es tratada como una sola carpeta por .NET CLR, pero en realidad se implementa utilizando carpetas NTFS (o FAT32) anidadas.

Para evitar ataques de suplantación de identidad, en los que un cracker intentaría hacer pasar un ensamblado que aparece como otra cosa, el ensamblado se firma con una clave privada. El desarrollador del ensamblado previsto mantiene la clave privada en secreto, por lo que un pirata no puede tener acceso a ella ni simplemente adivinarla. Por lo tanto, el cracker no puede hacer que su ensamblaje se haga pasar por otra cosa, sin la posibilidad de firmarlo correctamente después del cambio. Firmar el ensamblado implica tomar un hash de partes importantes del ensamblaje y luego encriptar el hash con la clave privada. El hash firmado se almacena en el ensamblado junto con la clave pública. La clave pública descifrará el hash firmado.Cuando CLR carga un ensamblado con un nombre fuerte, generará un hash del ensamblado y luego lo comparará con el hash descifrado. Si la comparación tiene éxito, significa que la clave pública en el archivo (y, por lo tanto, el token de clave pública) está asociada con la clave privada utilizada para firmar el ensamblado. Esto significará que la clave pública en el ensamblado es la clave pública del editor del ensamblado y, por lo tanto, se frustra un ataque de suplantación de identidad. "

rismo
fuente
6

El hash es una especie de "huella digital". Se firma con una clave privada que es propiedad (y solo conocida) del firmante. Si conoce la clave pública del firmante, puede verificar si el hash es realmente del firmante y, por lo tanto, si los datos / archivo realmente se originan en el firmante (y no se modifican). Las mismas claves públicas para algunos archivos en el GAC significan "todas firmadas por el mismo firmante".

ur.
fuente
por lo que el token es solo un indicador de la clave de publicación utilizada, ¿verdad? No participa directamente en el cifrado / descifrado
softwarematter
5

El token de clave pública es un extracto algo legible de la clave pública real. La clave pública completa se almacena dentro de un conjunto firmado y se utiliza para descifrar la firma (= hash cifrado). El cargador utiliza esto para verificar que el contenido no esté alterado (o dañado). El hash original fue cifrado por el autor usando una clave privada y solo alguien en posesión de esa clave puede producir una firma válida.

Cada empresa (o departamento) solo debe usar 1 par de claves, es por eso que ve grupos de PKT idénticos en el GAC.

Henk Holterman
fuente
1

Me gustaría agregar a las respuestas anteriores (especialmente a la que tiene la cita de Wikipedia) que la nomenclatura segura a través de la clave pública / privada no lo protege de obtener un ensamblaje cambiado o evita que alguien altere sus ensamblajes.

En primer lugar , un nombre seguro no garantiza que se pueda confiar en el ensamblaje. Solo tiene una clave pública / token de clave pública, pero no conoce a la persona que la firmó (excepto si de alguna manera anuncia que posee la clave pública de los ensamblados).

Por ejemplo, el pirata informático podría tomar su ensamblado, quitarle un nombre seguro (hay herramientas que lo hacen) y firmarlo con su propio nombre seguro. Para la confianza existe un tipo diferente de firma de código digital con el certificado. Implica que un tercero lo revise a usted y a su empresa y no es gratuito. Consulte la tecnología Authenticode:

https://msdn.microsoft.com/en-us/library/ms537359(v=vs.85).aspx

En segundo lugar , en la siguiente discusión describió brevemente un método de ataque de fuerza bruta para obtener un par de claves pública / privada con el mismo token de clave pública que produciría el mismo hash para un ensamblado manipulado:

https://groups.google.com/forum/?hl=en#!topic/microsoft.public.dotnet.security/Jo6PqypxJN8

Debo señalar que esto podría haberse abordado mediante la nomenclatura fuerte mejorada https://docs.microsoft.com/en-us/dotnet/framework/app-domains/enhanced-strong-naming

También se mencionó un error en la discusión que permitió omitir la validación del ensamblaje y cargar un ensamblado alterado en tiempo de ejecución. La investigación detallada está aquí, el error se corrigió en las versiones posteriores de .Net framework (por lo que el error presente para el antiguo .Net 1):

http://www.grimes.nildram.co.uk/workshops/fusionWSCrackThree.htm

En tercer lugar , iniciar .Net 3.5 sp1 para aumentar el rendimiento de la carga de los ensamblados no está validado por defecto para ensamblados de plena confianza.

https://docs.microsoft.com/en-us/dotnet/framework/app-domains/how-to-disable-the-strong-name-bypass-feature

La condición para los ensamblados: https://blogs.msdn.microsoft.com/shawnfa/2008/05/14/strong-name-bypass/

La discusión al respecto en Stack Overflow: ¿Los ensamblados .net firmados alguna vez se verifican por completo cuando se cargan, para verificar que no se hayan modificado?

Según tengo entendido, esto significa que el ensamblaje no se codifica durante la carga para verificar si

Por último , me gustaría mencionar que existe un debate sobre los pros y los contras de los nombres fuertes, ya que requieren que se especifique una versión ensamblada. Microsoft elimina el nombre seguro de algunos de sus productos: https://www.pedrolamas.com/2016/03/01/still-strong-naming-your-assemblies-you-do-know-its-2016-right/

En conclusión, Quería resumir todos los puntos mencionados. Cuando encontré nombres fuertes, MSDN y Wikipedia me engañaron al pensar que podría proporcionar algún tipo de defensa para las asambleas. Pensé "Genial" y el nombre fuerte se quedó en mi memoria como un mecanismo de protección. Hasta el momento tuve que pensar en la seguridad de mi archivo snk con clave privada y luego mi colega me dijo que no es tan "genial". Así que investigué un poco. Lo primero que aprendí fue que un nombre seguro no significa confianza, debe usar el certificado para ello. Aún así, pensé que si mantengo mi clave privada segura, entonces el ensamblaje manipulado no será firmado por mí, lo que significa que si alguien modificará mi ensamblaje, él también tendrá que modificar el letrero y el ensamblaje modificado no será cargado por el CLR. Ahora no No creo que un nombre fuerte lo garantice. Por lo tanto, debe confiar en él solo para garantizar la singularidad del ensamblaje.

PD. Perdón por la publicación larga con muchas referencias.

SENya
fuente