2011-08-26 16 views
7

Ho notato che gli assembly .NET core hanno PublicKey = 00000000000000000400000000000000. Non solo è più breve di quelli che sn.exe consente di generare (min 384 bit) ma ha anche molti zeri .Abbastanza speciale PublicKey in .NET core assembly

Come generare la chiave di firma con una tale chiave pubblica?

+0

Hai esaminato la documentazione dello strumento di firma 'sn.exe' da Windows SDK? –

+0

@dario_ramos: sì, l'ho fatto. –

+1

Vuoi che la tua chiave pubblica sia qualcosa di specifico, o hai solo un sacco di zeri? Posso chiedere perchè? –

risposta

5

Questa è la chiave pubblica definita standard ECMA.

E 'a che fare con tre esigenze contrastanti:

  1. un meccanismo che assicura che le assemblee sono firmati dai loro creatori e non avrebbe potuto essere creato da un altra parte fraudolenta.
  2. Quella CLI deve essere definita apertamente in modo tale che altre persone siano libere di implementare una versione (Mono sarebbe un esempio di vita reale).
  3. Che ci sia una libreria standard di classi rese disponibili con ogni versione del framework.

Queste tre cose non possono accadere allo stesso tempo!

Se creo una versione di .NET (punto 2), quindi ho bisogno di fornire una versione della libreria standard (punto 3), che deve essere attendibile (punto 1), quindi ho bisogno di firmare a Dimostrare che sono Microsoft. Oh aspetta, non sono Microsoft! (eh, punto 2 di nuovo).

Invece ciò che accade è:

  1. ho creare una coppia di chiavi pubblica-privata. Le persone che si fidano di creare nuove versioni di rilascio degli assembly nell'implementazione della mia libreria framework hanno accesso alla chiave privata, la chiave pubblica può essere nota a chiunque lavori sull'implementazione della CLI.

  2. mi segnano le assemblee pertinenti essendo stato firmato con la chiave corrispondente alla chiave pubblica 00000000000000000400000000000000 (definito nello standard ECMA), anche se in realtà sono stati firmati con la chiave privata di cui sopra.

  3. Nel codice nella CLI qualsiasi controllo su un assieme che dichiara di essere stato firmato con la chiave corrispondente alla chiave pubblica 00000000000000000400000000000000 viene verificato con la chiave pubblica reale. Se questo si verifica, allora può solo essere stato firmato da qualcuno di cui ci fidiamo nella costruzione di quegli assemblaggi.

Naturalmente, il quadro di MS non si fida nostre assemblee, Mono di Will non fidarsi di loro, e non si fida neanche di loro, perché tutti noi abbiamo diverse chiavi reali corrispondenti alla chiave standard ECMA. Quale è come dovrebbe essere.

Nel frattempo, il fatto che 00000000000000000400000000000000 non corrisponda a una vera chiave pubblica valida significa che non è possibile che sia in conflitto con qualsiasi altra chiave pubblica.

+0

+ Jon Hanna, Grazie per la spiegazione dettagliata! Sospettavo che la chiave fosse in qualche modo speciale, e ora vedo come. –