(Here is an English version of this text)
Die Integrität eines heruntergeladenen Softwarepakets kann durch einen kryptografischen Hash oder sogar eine kryptografischen Signatur überprüft werden, sofern ein solcher Hash oder eine solche Signatur vom Ersteller des Softwarepakets generiert und in einer mit der Software verknüpften Hash- oder Signaturdatei verfügbar gemacht wurde.
File Hashes können lediglich verwendet werden, um die Integrität einer Datei
zu überprüfen, um sicherzugehen, dass die Datei nicht von Dritten verändert wurde.
Kryptografische Signaturen geben zusätzlich Aufschluss darüber, wer die Signatur erstellt hat und wann sie erstellt wurde. Damit ist es möglich, die Authentizität einer Datei zu überprüfen, d.h. ob sie tatsächlich aus einer vertrauenswürdigen Quelle stammt.
Mit File Hashes kann die Integrität einer Datei überprüft werden. Dabei können verschiedene Hash-Funktionen verwendet werden, die unterschiedliche Grade an Sicherheit bieten. Momentan werden die Hash-Funktionen SHA256 und SHA512 als sicher genug angesehen, um die Integrität von Dateien zu gewährleisten. Ältere Verfahren wie SHA1 oder MD5 sollten dagegen nicht mehr verwendet werden, weil sie als zu unsicher angesehen werden.
Meinberg stellt für einige Download-Dateien zusätzliche SHA512SUM- oder SHA256SUM-Dateien zur Verfügung, z.B. für das Meinberg Treiberpaket für Linux, das außer als Git-Repo auch als Sourcecode-Archiv mit entsprechenden Signatur-Dateien angeboten wird.
Auf Linux und anderen Unix-ähnlichen Systemen sind die Tools zum Erstellen oder Überprüfen eines Hashs normalerweise vorinstalliert, so dass man einfach einen Befehl in einem Terminalfenster ausführen können, z.B.:
sha512sum -c mbgtools-lx.tar.gz.sha512sum mbgtools-lx.tar.gz: OK
Ähnlich ist es mit SHA256-Prüfsummen, bei denen man lediglich sha512
durch sha256
ersetzen muss.
Für Programmpaketen von Meinberg für Windows ist es eigentlich nicht nötig, File Hashes zu haben und diese zu überprüfen, da diese bereits mit digitalen Signaturen versehen sind.
Dennoch werden für einige Pakete für Windows auch SHA512- oder SHA256-Hashes angeboten, denn mit diesen lässt sich die Integrität eines Pakets direkt nach einem Download sehr einfach überprüfen.
Auf Windows-Systemen stehen Programme wie sha256sum
oder sha512sum
ebenfalls zur Verfügung,
wenn man Programmpakete wie git for Windows
oder die Programmierumgebung MSYS/MinGW
installiert hat und darunter ein Kommandozeilen-Fenster öffnet.
Die Vorgehensweise ist dann genauso wie für Linux beschrieben.
Aktuelle Windows-Versionen (z.B. Windows 10 und neuer) bieten in der PowerShell einen Befehl an, mit dem man einen File Hash erzeugen oder überprüfen kann.
GetContent dkwin.exe.sha256sum Get-FileHash dkwin.exe -Algorithm SHA256
Der erste Befehl zeigt den Hash an, der ursprünglich für die Datei dkwin.exe
erzeugt wurde und
in der Datei dkwin.exe.sha256sum
gespeichert ist. Die Datei-Endung deutet an, dass hier der SHA256-Algorithmus
verwendet wurde, um den Hash-Wert zu berechnen.
Der zweite Befehl berechnet den Hash für die vorliegende Datei dkwin.exe
,
wobei wichtig ist, dass der gleiche Algorithmus verwendet wird, also hier SHA256.
Die Datei dkwin.exe
unterscheidet sich nicht von der Original-Datei, wenn beide angezeigten Hash-Werte
identisch sind, wobei sich die Groß-/Kleinschreibung durchaus unterscheiden darf.
In älteren Windows-Versionen (z.B. Windows 7) steht der
oben genannte PowerShell-Befehl noch nicht zur Verfügung.
Auf solchen Systemen kann der certUtil
-Befehl in einer normalen Kommandozeile (cmd.exe
) verwendet werden,
um einen File Hash zu erzeugen oder zu überprüfen:
type dkwin.exe.sha256sum certUtil -hashfile dkwin.exe SHA256 | findstr /v “hash”
Der erste Befehl zeigt den in der Hash-Datei dkwin.exe.sha256sum
gespeicherten Hash an, der
für die Datei dkwin.exe
mithilfe des SHA256-Algorithmus generiert wurde.
Der zweite Befehl berechnet den Hash für die vorliegende Datei dkwin.exe
,
wobei wichtig ist, dass der gleiche Algorithmus verwendet wird, also hier SHA256.
Die Datei dkwin.exe
unterscheidet sich nicht von der Original-Datei, wenn beide angezeigten Hash-Werte
identisch sind, wobei sich die Groß-/Kleinschreibung durchaus unterscheiden darf und in der Ausgabe des
certUtil
-Befehl Leerzeichen enthalten sein können.
GnuPrivacyGuard (GnuPG or GPG) ist eine Open-Source-Alternative zu der älteren, proprietären Software PrettyGoodPrivacy (PGP). Beide implementieren Public Key-Verschlüsselungsverfahren, wie sie im openPGP-Standard (RFC4880) festgelegt sind.
Public Key-Verschlüsselungsverfahren verwenden Schlüsselpaare, die aus jeweils einem privaten und einem öffentlichen Schlüssel bestehen.
Wie der Name schon sagt, darf der private Schlüssel nur dem Eigentümer des Schlüsselpaars zugänglich sein, der ihn beispielsweise zum Erstellen einer kryptografischen Signatur für eine Datei verwenden kann.
Die Signatur wird häufig in einer zusätzlichen Datei gespeichert, die denselben Grundnamen wie die Originaldatei hat, jedoch mit zusätzlichen Erweiterung. Diese Signaturdatei wird dan zusammen mit der Originaldatei weitergegeben.
Die angehängte Dateinamenerweiterung lautet häufig .sig
, wenn es sich um eine Signatur im Binärformat handelt,
oder .asc
, wenn die Signatur in einem bestimmten ASCII-Textformat gespeichert ist.
Für die Funktionsweise ergibt sich jedoch kein Unterschied.
Zur Überprüfung einer Signatur muss der öffentliche Schlüssel verwendet werden, der zu dem privaten Schlüssel gehört,
der zur Erstellung der Signatur verwendet wurde. Daher sollte der öffentliche Schlüssel, wie der Name schon sagt, öffentlich verfügbar und leicht zu finden sein.
Öffentliche Schlüssel sind sehr oft auf dem öffentlichen Schlüsselserver des openPGP-Projekts verfügbar:
Auf Linux und anderen Unix-ähnlichen Systemen ist das Programm gpg
normalerweise vorinstalliert,
so dass man einfach den gpg
-Befehl mit passenden Parametern in einem Terminalfenster ausführen können, z. B.:
$ gpg --verify mbgtools-lx.tar.gz.sig gpg: assuming signed data in 'mbgtools-lx.tar.gz' gpg: Signature made Wed Dec 20 12:10:39 2023 CET gpg: using RSA key 078BED723084EACF649E2FB041721C0C7509F9C8 gpg: issuer “martin.burnicki@meinberg.de” gpg: Good signature from "Martin Burnicki (Meinberg Funkuhren GmbH & Co. KG)" [ultimate]
Im obigen Beispiel ist der benötigte öffentliche Schlüssel bereits lokal verfügbar und die Überprüfung erfolgreich. Andernfalls wird eine Warnung angezeigt und der fehlende Schlüssel muss zunächst importiert werden.
Wenn der Schlüssel, der zum Erstellen der Signatur verwendet wurde, dem System, auf dem der Befehl ausgeführt wird, noch nicht bekannt ist, wird ein zugehöriger Fehler angezeigt:
$ gpg --verify mbgtools-lx.tar.gz.sig
gpg: assuming signed data in 'mbgtools-lx.tar.gz'
gpg: Signature made Wed Dec 20 12:10:39 2023 CET
gpg: using RSA key 078BED723084EACF649E2FB041721C0C7509F9C8
gpg: issuer “martin.burnicki@meinberg.de”
gpg: Can't check signature: No public key
In diesem Fall wurde ein Schlüssel mit der ID 078BED723084EACF649E2FB041721C0C7509F9C8
zum Erstellen der Signatur verwendet, der öffentliche Schlüssel ist jedoch noch nicht lokal verfügbar.
Normalerweise können öffentliche Schlüssel von einem Schlüsselserver heruntergeladen werden.
Der zu verwendende Schlüsselserver kann optional auf der Kommandozeile angegeben werden:
$ gpg --keyserver hkps://keys.openpgp.org --receive-keys 078BED723084EACF649E2FB041721C0C7509F9C8codedoc:<b>imported: 1</b>~~
Sobald der GPG-Schlüssel importiert wurde, kann die Signatur der Datei überprüft werden:
$ gpg --verify mbgtools-lx.tar.gz.sig gpg: assuming signed data in 'mbgtools-lx.tar.gz' gpg: Signature made Wed Dec 20 12:10:39 2023 CET gpg: using RSA key 078BED723084EACF649E2FB041721C0C7509F9C8 gpg: issuer “martin.burnicki@meinberg.de” gpg: Good signature from “Martin Burnicki (Meinberg Funkuhren GmbH & Co. KG)” [unknown] gpg: WARNING: This key is not certified with a trusted signature! gpg: There is no indication that the signature belongs to the owner. Primary key fingerprint: 078B ED72 3084 EACF 649E 2FB0 4172 1C0C 7509 F9C8
Allerdings erscheint oben ein WARNING:
, da gpg
nicht weiß, ob diesem Schlüssel vertraut werden kann.
Nur wenn wirklich sichergestellt ist, dass der Schlüssel tatsächlich dem vorgeblichen Eigentümer gehört,
sollte die Vertrauensstufe des Schlüssels z.B. auf 5
, ultimate
hochgesetzt werden.
Dazu kann der folgende interaktive Befehl ausgeführt werden:
gpg --edit-key 078BED723084EACF649E2FB041721C0C7509F9C8 trust
Anschließend sollte die Verifizierung der Signatur ohne Warnung funktionieren, wie am Anfang gezeigt.
Für Programmpaketen von Meinberg für Windows sind File Hashes eigentlich nicht nötig, da Software-Pakete wie die Treiber-Software für Windows, oder der NTP-Installer für Windows in der Regel vollständig kryptographisch signiert sind.
Jedes ausführbare Programm in einem dieser Pakete sowie die Installationsprogramme selbst wurden mit einem Zertifikat signiert, das von einer anerkannten Zertifizierungsstelle erstellt wurde, die von Microsoft dafür autorisiert wurde.
Anders als bei der Verwendung von PGP/GPG-Signaturen ist es nicht erforderlich, zunächst den öffentlichen Schlüssel des Erstellers der Signatur zu importieren, da es eine ganze Zertifikatskette gibt von dem Zertifikat, das zum Erstellen der Signaturen verwendet wurde bis hin zum Stammzertifikat von Microsoft.
Diese bei Windows übliche Signatur ist sicherer als ein File Hash, daher kann eigentlich auf einen File Hash verzichtet werden.
Trotzdem werden auch für einige Windows-Pakete SHA512- oder SHA256-Hashes angeboten, denn mit diesen ist es sehr einfach, die Integrität eines Paketes gleich nach einem Download zu überprüfen.
Windows überprüft digitale Signaturen sowieso automatisch, aber die Signatur kann auch manuell überprüft werden.
Dazu macht man im Datei-Explorer einen Rechts-Klick auf die zu überprüfende Datei, wählt Eigenschaften
aus und klickt auf den Tab Digitale Signaturen
. Wenn man dort eine der Signaturen auswählt und auf den
Details
-Knopf klickt, öffnet sich ein neues Fenster, das anzeigt, ob diese Signatur gültig ist oder nicht.
Wenn der Tab Digitale Signaturen
nicht in den Eigenschaften angezeigt wird, ist keine digitale Signatur
in der Datei vorhanden, und somit kann die Integrität der Datei auf diese Weise nicht überprüft werden.
— Martin Burnicki martin.burnicki@meinberg.de, last updated 2024-02-15