Welche Rolle spielt das Token für öffentliche Schlüssel?

79

Welche Rolle spielt das Token für öffentliche Schlüssel? Hat es einen Anteil an der Entschlüsselung des signierten Hashs? Warum gibt es in GAC so viele Assemblys von Microsoft mit demselben Token für öffentliche Schlüssel?

devnull
quelle
1
@Bombe, das Entschlüsseln eines Signatur-Hashs wäre korrekt, nur 1 Fehler.
Henk Holterman
Siehe auch stackoverflow.com/q/573079/284795
Colonel Panic
Wenn Sie mit SSH oder PGP vertraut sind, ist dies das, was Sie als Fingerabdruck kennen, d. H. Eine verkürzte Version des öffentlichen Schlüssels, die mit dem Auge leichter zu überprüfen ist.
Colonel Panic

Antworten:

160

Welche Rolle spielt das Token für öffentliche Schlüssel?

Das Token für den öffentlichen Schlüssel ist eine kleine Zahl, bei der es sich um ein praktisches "Token" handelt, das einen öffentlichen Schlüssel darstellt. Öffentliche Schlüssel sind ziemlich lang; Mit dem Token für öffentliche Schlüssel können Sie auf Schlüssel verweisen, ohne den gesamten Schlüssel zu sagen. Sortieren der gleichen Art und Weise „Der Herr der Ringe“ sagen will , ist fünf Worte , die repräsentieren eine Halb a-Millionen-Wort Roman. Es wäre ziemlich unpraktisch, wenn Sie jedes Mal, wenn Sie darüber sprechen wollten, diese eine halbe Million Wörter angeben müssten.

Hat es einen Anteil an der Entschlüsselung des signierten Hash?

Nein. Das Token für den öffentlichen Schlüssel enthält keine "Informationen". Es ist nur eine Zahl, die einen öffentlichen Schlüssel darstellt. Es ist selbst kein öffentlicher Schlüssel.

Warum gibt es so viele Assemblys von Microsoft mit demselben Token für öffentliche Schlüssel?

Weil sie alle mit demselben privaten Schlüssel signiert wurden - dem privaten Schlüssel von Microsoft - und daher alle mit demselben öffentlichen Schlüssel überprüft werden und daher alle dasselbe Token für öffentliche Schlüssel haben.

Eric Lippert
quelle
3
Was für eine klare und perfekte Antwort Eric!
Aditya Bokade
@ Ammar per Code überprüfen Sie die Assembly.FullNameEigenschaft, um es über Befehlszeilentools zu erhalten, siehe diese Antwort
Scott Chamberlain
14

Aus Wikipedia

"Das Token für den öffentlichen Schlüssel wird verwendet, um den Assemblynamen eindeutig zu machen. Daher können zwei Assemblys mit starkem Namen denselben PE-Dateinamen haben, und dennoch erkennt .NET sie als unterschiedliche Assemblys. Das Windows-Dateisystem (FAT32 und NTFS) erkennt nur den PE-Dateiname, daher können zwei Assemblys mit demselben PE-Dateinamen (aber unterschiedlicher Kultur, Version oder unterschiedlichem Token für öffentliche Schlüssel) nicht im selben Windows-Ordner vorhanden sein. Um dieses Problem zu beheben, führt .NET den so genannten GAC (Global Assembly Cache) ein Wird von der .NET CLR als einzelner Ordner behandelt, wird jedoch tatsächlich mithilfe verschachtelter NTFS- (oder FAT32-) Ordner implementiert.

Um Spoofing-Angriffe zu verhindern, bei denen ein Cracker versuchen würde, eine als etwas anderes erscheinende Assembly weiterzugeben, wird die Assembly mit einem privaten Schlüssel signiert. Der Entwickler der beabsichtigten Assembly hält den privaten Schlüssel geheim, sodass ein Cracker weder darauf zugreifen noch ihn einfach erraten kann. Daher kann der Cracker seine Baugruppe nicht dazu bringen, sich als etwas anderes auszugeben, da die Möglichkeit fehlt, es nach der Änderung korrekt zu signieren. Beim Signieren der Assembly wird ein Hash wichtiger Teile der Assembly erstellt und anschließend der Hash mit dem privaten Schlüssel verschlüsselt. Der signierte Hash wird zusammen mit dem öffentlichen Schlüssel in der Assembly gespeichert. Der öffentliche Schlüssel entschlüsselt den signierten Hash.Wenn die CLR eine stark benannte Assembly lädt, generiert sie einen Hash aus der Assembly und vergleicht diesen mit dem entschlüsselten Hash. Wenn der Vergleich erfolgreich ist, bedeutet dies, dass der öffentliche Schlüssel in der Datei (und damit das Token für den öffentlichen Schlüssel) dem privaten Schlüssel zugeordnet ist, der zum Signieren der Assembly verwendet wird. Dies bedeutet, dass der öffentliche Schlüssel in der Assembly der öffentliche Schlüssel des Assembly-Herausgebers ist und somit ein Spoofing-Angriff vereitelt wird. ""

Risma
quelle
6

Der Hash ist eine Art "Fingerabdruck". Es wird mit einem privaten Schlüssel signiert, der dem Unterzeichner gehört (und nur bekannt ist). Wenn Sie den öffentlichen Schlüssel des Unterzeichners kennen, können Sie überprüfen, ob der Hash wirklich vom Unterzeichner stammt und ob die Daten / Dateien wirklich vom Unterzeichner stammen (und unverändert sind). Gleiche öffentliche Schlüssel für einige Dateien im GAC bedeuten "alle vom gleichen Unterzeichner signiert".

ur.
quelle
Das Token ist also nur ein Indikator für den verwendeten Pub-Schlüssel, oder? Es nimmt nicht direkt an der Verschlüsselung / Entschlüsselung teil
devnull
5

Das Public Key Token ist ein etwas lesbarer Auszug aus dem realen öffentlichen Schlüssel. Der vollständige öffentliche Schlüssel wird in einer signierten Assembly gespeichert und zum Entschlüsseln der Signatur (= verschlüsselter Hash) verwendet. Der Lader verwendet dies, um sicherzustellen, dass der Inhalt nicht manipuliert (oder beschädigt) wird. Der ursprüngliche Hash wurde vom Autor mit einem privaten Schlüssel verschlüsselt, und nur jemand, der diesen Schlüssel besitzt, kann eine gültige Signatur erstellen.

Jedes Unternehmen (oder jede Abteilung) sollte nur 1 Schlüsselpaar verwenden. Aus diesem Grund werden im GAC Gruppen identischer PKTs angezeigt.

Henk Holterman
quelle
1

Ich möchte zu den vorherigen Antworten (insbesondere zu denen mit dem Zitat aus Wikipedia) hinzufügen, dass die starke Benennung über den öffentlichen / privaten Schlüssel Sie nicht davor schützt, eine geänderte Assembly zu erhalten, oder verhindert, dass jemand Ihre Assemblys manipuliert.

Erstens garantiert ein starker Name nicht, dass der Assembly vertraut werden kann. Sie haben nur einen öffentlichen Schlüssel / ein öffentliches Schlüssel-Token, kennen aber nicht die Person, die ihn signiert hat (außer wenn sie irgendwie ankündigt, dass sie den öffentlichen Schlüssel der Assemblys besitzt).

Zum Beispiel könnte der Hacker Ihre Assembly nehmen, einen starken Namen daraus entfernen (es gibt Tools, die dies tun) und sie mit einem eigenen starken Namen signieren. Für das Vertrauen gibt es eine andere Art der digitalen Codesignatur mit dem Zertifikat. Es beinhaltet die Überprüfung durch Dritte und Ihr Unternehmen und ist nicht kostenlos. Testen Sie die Authenticode-Technologie:

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

Zweitens wurde in der folgenden Diskussion kurz eine Brute-Force-Angriffsmethode beschrieben, um ein öffentliches / privates Schlüsselpaar mit demselben öffentlichen Schlüssel-Token zu erhalten, das denselben Hash für eine manipulierte Assembly erzeugen würde:

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

Ich muss beachten, dass dies durch die verbesserte starke Benennung https://docs.microsoft.com/en-us/dotnet/framework/app-domains/enhanced-strong-naming behoben werden konnte

In der Diskussion wurde auch ein Fehler erwähnt, der es ermöglichte, die Validierung der Assembly zu überspringen und eine manipulierte Assembly zur Laufzeit zu laden. Die detaillierte Recherche ist hier, der Fehler wurde in den späteren Versionen des .Net-Frameworks behoben (also der Fehler für das alte .Net 1):

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

Drittens wird das Starten von .Net 3.5 sp1 zur Erhöhung der Leistung beim Laden der Assemblys nicht standardmäßig für Assemblys mit vollständiger Vertrauenswürdigkeit überprüft.

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

Die Bedingung für Assemblys: https://blogs.msdn.microsoft.com/shawnfa/2008/05/14/strong-name-bypass/

Die Diskussion darüber zum Stapelüberlauf: Werden signierte .net-Assemblys beim Laden jemals vollständig überprüft, um zu überprüfen, ob sie nicht geändert wurden?

Soweit ich weiß, bedeutet dies, dass die Baugruppe beim Laden nicht gehasht wird, um zu überprüfen, ob dies der Fall ist

Abschließend möchte ich erwähnen, dass es eine Debatte über Vor- und Nachteile einer starken Benennung gibt, da sie die Angabe einer Assembly-Version erfordern. Microsoft entfernt starke Namen von einigen seiner Produkte: https://www.pedrolamas.com/2016/03/01/still-strong-naming-your-assemblies-you-do-know-its-2016-right/

AbschließendIch wollte alle genannten Punkte zusammenfassen. Als ich auf starke Namen stieß, wurde ich von MSDN und Wikipedia irregeführt, dass dies eine Art Verteidigung für die Versammlungen darstellen könnte. Ich dachte "Cool" und die starke Benennung blieb mir als Schutzmechanismus in Erinnerung. Bis zu dem Moment musste ich über die Sicherheit meiner snk-Datei mit privatem Schlüssel nachdenken und dann sagte mir mein Kollege, dass es nicht so "cool" ist. Also habe ich ein bisschen recherchiert. Das erste, was ich gelernt habe, war, dass ein starker Name kein Vertrauen bedeutet. Sie sollten das Zertifikat dafür verwenden. Trotzdem dachte ich, wenn ich meinen privaten Schlüssel sicher verwahre, wird die manipulierte Assembly nicht von mir signiert. Wenn also jemand meine Assembly ändert, muss er auch das Zeichen ändern und die geänderte Assembly wird nicht von geladen die CLR. Jetzt ziehe ich nicht an Ich glaube nicht, dass eine starke Benennung dies garantiert. Sie sollten sich also nur darauf verlassen, um die Einzigartigkeit der Baugruppe zu gewährleisten.

PS. Entschuldigung für den langen Beitrag mit vielen Referenzen.

SENya
quelle