Ich versuche zu verstehen, was beim Überprüfen einer getrennten GPG-Signatur passiert.
Hier ist ein Beispiel aus dem gnupgHandbuch:
blake% gpg --verify doc.sig doc
gpg: Signature made Fri Jun 4 12:38:46 1999 CDT using DSA key ID BB7576AC
gpg: Good signature from "Alice (Judge) <[email protected]>"
Wie stellt GPG fest, dass die Signatur gut ist? Enthält die Signatur einen Hash der signierten Datei? Wenn ja, wie extrahiert man diesen Hash aus der Signatur selbst?
Ich habe es versucht gpg --list-packets <signature>
, aber es scheinen nicht alle Informationen angezeigt zu werden.
Antwort1
Sie können die --list-packets
Option verwenden, um einen Dump des Inhalts einer GPG-Datei zu erhalten. Die Beschreibung des Dateiformats lautetRFC 4880(OpenPGP-Standard).
Die Signatur enthält nicht direkt einen Hash. Sie enthält Informationen, die es ermöglichen, sowohl den Hash als auch den Absender zu verifizieren: Es gibt eineSignaturüberprüfungsalgorithmus, das einen Hash-Wert und einen öffentlichen Schlüssel als Eingabe verwendet und zurückgibtJaoderNEIN; der Algorithmus gibt zurückJawenn die Signatur mit dem privaten Schlüssel erstellt wurde, der dem angegebenen öffentlichen Schlüssel entspricht, aus einer Nachricht mit dem angegebenen privaten Schlüssel, und gibt zurückNEINunter allen anderen Umständen (Signatur eines anderen Hashs, Signatur mit einem anderen Schlüssel oder eine Reihe von Bytes, die überhaupt keine Signatur sein können). Unter demDSAAlgorithmus, ich denke, es ist nicht durchführbar, den Hash aus einer Signatur zu extrahieren, wenn Sie nicht über den privaten Schlüssel verfügen.
Die Signaturdatei enthält die Identität des Unterzeichners sowie den Signaturwert. Um die Signatur zu verifizieren, liest gpg den öffentlichen Schlüssel des Unterzeichners aus Ihrem Schlüsselbund, berechnet den Hash der Daten und wendet den Signaturverifizierungsalgorithmus an.
Antwort2
$ gpg --list-packets myfile.asc
[...]
digest algo 10, begin of digest 77 dd
Hier sehen Sie, welcher Digest-Algorithmus verwendet wurde. Leider verrät uns weder die Manpage noch die ID, gpg --version
welcher Algorithmus welcher ID zugeordnet ist. Wir müssen uns in den RFC des Paketformats vertiefen, um diese Informationen zu finden:https://www.rfc-editor.org/rfc/rfc4880#section-9.4
ID Algorithm Text Name
-- --------- ---------
1 - MD5 [HAC] "MD5"
2 - SHA-1 [FIPS180] "SHA1"
3 - RIPE-MD/160 [HAC] "RIPEMD160"
4 - Reserved
5 - Reserved
6 - Reserved
7 - Reserved
8 - SHA256 [FIPS180] "SHA256"
9 - SHA384 [FIPS180] "SHA384"
10 - SHA512 [FIPS180] "SHA512"
11 - SHA224 [FIPS180] "SHA224"
100 to 110 - Private/Experimental algorithm
Antwort3
Ja, digitale Signaturen sind normalerweise sichere Hashes, die mit dem geheimen Schlüssel des Unterzeichners signiert sind.
Das Signieren der gesamten Nachricht ist viel langsamer und nicht sicherer. Darüber hinaus sollte der Algorithmus die Länge der Blöcke, das Auffüllen (so dass nicht zu viele Informationen preisgegeben werden) usw. berücksichtigen.
Hinweis: Auch bei der asymmetrischen Verschlüsselung wird aus Geschwindigkeitsgründen nur ein flüchtiger symmetrischer Schlüssel asymmetrisch verschlüsselt und der Rest der Nachricht wird nur symmetrisch verschlüsselt.