2011-08-26 22 views
7

Me he dado cuenta de que los ensamblados .NET principales tienen PublicKey = 00000000000000000400000000000000. No solo es más corto que los sn.exe permiten generar (mínimo 384 bits) pero también tiene muchos ceros .PublicKey bastante especial en ensamblados de núcleo .NET

¿Cómo generar la clave de firma con una clave pública tan elegante?

+0

¿Ha consultado la documentación de la herramienta de firma 'sn.exe' del SDK de Windows? –

+0

@dario_ramos: sí, lo hice. –

+1

¿Desea que su clave pública sea algo específico, o simplemente tiene muchos ceros? ¿Puedo preguntar por qué? –

Respuesta

5

Esa es la clave pública definida estándar de ECMA.

Es que lidiar con tres requisitos conflictivos:

  1. un mecanismo que garantice que las asambleas son firmados por sus creadores y no podría haber sido creado por un interlocutor fraudulenta.
  2. Esa CLI se define abiertamente de tal manera que otras personas son libres de implementar una versión (Mono sería un ejemplo de la vida real).
  3. Que haya una biblioteca de clases estándar disponible con cada versión del marco.

¡Estas tres cosas no pueden suceder al mismo tiempo!

Si creo una versión de .NET (punto 2), entonces tengo que proporcionar una versión de la biblioteca estándar (punto 3), que necesita ser de confianza (punto 1), así que tengo que firmarlo para demostrar que soy Microsoft. Oh, espera, ¡no soy Microsoft! (eh, punto 2 de nuevo).

En cambio, lo que ocurre es:

  1. puedo crear un par de claves pública y privada. Las personas de confianza para crear nuevas versiones de lanzamiento de los ensamblajes en la implementación de la biblioteca de mi framework tienen acceso a la clave privada, la clave pública puede ser conocida por cualquiera que haga algún trabajo en la implementación de CLI.

  2. Marque los ensamblajes correspondientes como si hubieran sido firmados con la clave correspondiente a la clave pública 00000000000000000400000000000000 (definida en la norma ECMA), aunque en realidad estaban firmados con la clave privada mencionada anteriormente.

  3. En el código de la CLI se comprueba con una clave pública real cualquier comprobación de un conjunto que afirma haber sido firmado con la clave correspondiente a la clave pública 00000000000000000400000000000000. Si esto se verifica, solo puede haber sido firmado por alguien en quien confiamos para construir esas asambleas.

Por supuesto, el marco de la EM no confiará en nuestras asambleas, Mono de no confiar en ellos, y no vamos a confiar en ninguno de ellos, porque todos tenemos diferentes teclas reales correspondientes a la clave estándar ECMA. Lo que es como debería ser.

Mientras tanto, el hecho de que 00000000000000000400000000000000 no coincida con ninguna clave pública válida real significa que no es posible que choque con ninguna otra clave pública.

+0

+ Jon Hanna, ¡gracias por la explicación detallada! Sospeché que la clave es de alguna manera especial, y ahora veo cómo. –

Cuestiones relacionadas