Wie Softwaresignaturen die Sicherheit von Anwendungen und Code schützen
Softwaresignaturen spielen eine entscheidende Rolle bei der Gewährleistung der Sicherheit der Anwendungen und Software, die wir täglich verwenden. Indem sie sicherstellen, dass der Code nicht verändert oder manipuliert wurde, bieten diese Signaturen eine zusätzliche Schutzebene für Benutzer und Entwickler gleichermaßen. In diesem Artikel untersuchen wir, wie Softwaresignaturen die Softwaresicherheit verbessern und ihre Zuverlässigkeit gewährleisten.
Stellen Sie sich vor, Sie sind Softwareentwickler und teilen Ihre Software oder deren Updates im Internet. Wie stellen Sie sicher, dass jemand Ihre Software nicht manipuliert und diese gefälschte Version an Ihre Kunden verteilt? Die Lösung besteht darin, das Programm zu signieren. Die Funktionsweise dieser Signaturen ist sehr clever und faszinierend.
Was ist eine Softwaresignatur?
Wir verwenden handschriftliche Unterschriften zur Selbstidentifikation aus zwei Gründen: Sie sollen überprüfbar und fälschungssicher sein. Dasselbe Prinzip gilt, wenn Sie sicherstellen möchten, dass die Kopie eines Programms auf Ihrem Computer original ist und in keiner Weise verändert wurde. Der Entwickler hinterlässt eine digitale Signatur auf dem Softwarepaket (es kann nicht gefälscht werden) und Kunden überprüfen diese Signatur auf ihrer Kopie, bevor sie die Software installieren.
Dies gilt auch für Software-Updates. Ein bösartiges Update (z. B. als Treiber getarnte Malware) kann auf Ihrem Gerät verheerende Schäden anrichten. Ihr Betriebssystem (sei es Windows, macOS oder Linux) muss überprüfen, ob das Update von der Originalquelle stammt, bevor es auf dem System installiert wird.
Digitale Signaturen sollen die gleichen zwei Funktionen erfüllen wie eine handschriftliche Unterschrift, ihre tatsächliche Funktionsweise könnte jedoch unterschiedlicher nicht sein. Um digitale Signaturen zu erstellen und zu überprüfen, sind einige wirklich clevere kryptografische Tricks erforderlich.
So verbergen Sie eine geheime Nachricht in der Öffentlichkeit
Nehmen wir an, Sie möchten einem Freund ein Geheimnis über handschriftliche Notizen mitteilen. In diesem Szenario sollten Sie es auch an einem öffentlichen Ort abgeben, damit Ihr Freund es später abholen kann. Jeder, der vorbeikommt, kann den Zettel abholen und Ihr Geheimnis lesen. Hier ist also unser Problem: Wie stellen wir sicher, dass nur Ihr Freund die Nachricht lesen kann, auch wenn jemand die Notiz übernimmt?
Der clevere Weg besteht darin, dieses gemeinsame Geheimnis mit einem „Schlüssel“ zu sperren und zu entsperren. Erlauben Sie mir, es zu erklären.
Sie und Ihr Freund einigen sich auf einen Schlüssel und verwenden diesen Schlüssel, um Ihre geheime Nachricht in unsinnigen Lärm zu verwandeln. Der Schlüssel könnte alles sein. Beispielsweise können die Parteien vereinbaren, jeden Buchstaben der Nachricht durch den Buchstaben zu ersetzen, der im Alphabet unmittelbar darauf folgt.
Dann nehmen Sie Ihre Nachricht und ersetzen jeden Buchstaben darin entsprechend dem Schlüssel. Aus der Meldung „SECRET“ wird also „TFDSFU“. Sie schreiben „TFDSFU“ auf einen Zettel und hinterlassen ihn an einem öffentlichen Ort. Ihr Freund kann es entschlüsseln, da er den Schlüssel hat, den Sie zuvor ausgetauscht haben. Er muss also nur jeden Buchstaben an eine Stelle in „TFDSFU“ verschieben und erhält den Originalbuchstaben „SECRET“. Wer lauscht, sieht den Unsinn nur, weil er erst den Schlüssel braucht, um die Nachricht zu verstehen.
Was wir hier gerade beschrieben haben, ist eine sehr einfache Verschlüsselungstechnik und der verwendete Schlüssel ist die grundlegende Caesar-Chiffre.
Wie Computer geheime Nachrichten über das Internet versenden
Stellen Sie sich nun vor, Sie machen dasselbe online und möchten, dass Ihre Kommunikation absolut sicher ist. In der realen Welt kann man sich vorab treffen und untereinander Schlüssel austauschen. Im Internet ist der Austausch des Schlüssels auf diese Weise nicht möglich, da es sich um einen öffentlichen Ort handelt. Jeder kann diesen Schlüssel erfassen und damit den Rest Ihrer Kommunikation entschlüsseln. Wie tauscht man also einen Schlüssel aus, ohne ihn mit einem Freund zu teilen?
Sie benötigen also einen Switch, um sicher zu kommunizieren, aber Sie müssen den Switch zuerst sicher anschließen. Auf diese Weise können Sie zwei Computer dazu bringen, sich auf denselben Schlüssel zu einigen, ohne diesen Schlüssel über das Internet zu senden.
Ohne zu sehr auf technische Details einzugehen, arbeitet die Kryptographie mit mathematischen Gleichungen, die in einer Richtung leicht zu lösen sind, in der entgegengesetzten Richtung jedoch äußerst schwierig (oder sogar unmöglich). Wenn der Computer also die Gleichung mit allen darin enthaltenen ganzen Zahlen hat, kann er sie leicht lösen. Es wäre ihm jedoch unmöglich, die Gleichung selbst zurückzuentwickeln, wenn er die Lösung hätte.
ملاحظة
Ich vereinfache hier viel, sonst wären wir den ganzen Tag hier. Wenn Sie tiefer in die Funktionsweise eintauchen möchten, werfen Sie einen Blick auf den Diffie-Hellman-Schlüsselaustausch.
Dies ist das Szenario: Es gibt Computer A, Computer B und einen öffentlichen Raum. Es beginnt mit einem Schlüssel, der an den öffentlichen Raum gesendet wird (nennen wir ihn den öffentlichen Schlüssel). Computer A generiert einen weiteren Schlüssel und hält ihn privat (nennen wir ihn privaten Schlüssel A). Computer B macht dasselbe.
Der öffentliche Schlüssel steht jedem zur Verfügung, der private Schlüssel von A und B wird jedoch sicher auf ihren Computern aufbewahrt.
Jetzt nimmt Computer A den öffentlichen Schlüssel und kombiniert ihn mit seinem privaten Schlüssel, um eine Kombination zu erstellen. Computer B macht dasselbe mit seinem privaten Schlüssel. Beide Zusammensetzungen sind unterschiedlich. Anstatt ihre privaten Schlüssel an den öffentlichen Raum zu senden, senden Computer diese Kombinationen dorthin.
Denken Sie daran, dass es unmöglich ist, diese Kombinationen zurückzuentwickeln, um den privaten Schlüssel zu finden, der zu ihrer Erstellung verwendet wurde. Zu keinem Zeitpunkt sieht keiner der Computer die privaten Schlüssel des anderen.
Jetzt kommen wir zum eigentlichen Trick. Jeder Computer nimmt die vom anderen in den öffentlichen Raum geschickte Gruppe auf. Computer A fügt diesem Satz dann seinen privaten Schlüssel zusammen mit seinem eigenen Schlüssel hinzu, um den endgültigen Schlüssel zu erhalten. Der andere Computer macht dasselbe mit seinem privaten Schlüssel und erhält denselben endgültigen Schlüssel, den Computer A erstellt hat.
Jetzt verfügen beide Computer über denselben Schlüssel, mit dem sie alle zukünftige Kommunikation ver- und entschlüsseln können. Hier ist die einfache Antwort: Die beiden Computer „erstellen“ ihre eigene Kopie des Schlüssels, ohne den Schlüssel selbst zu teilen.
Dieser gesamte Prozess wird als Public-Key-Kryptographie bezeichnet. Diese Art der Public-Key-Kryptographie ist die Grundlage für digitale Signaturen wie Softwaresignaturen.
Wie Entwickler eine geheime Signatur in ihrem Code verbergen
Software zum digitalen Signieren umfasst auch öffentliche und private Schlüssel. Die Absicht ist jedoch eine andere, daher ist auch die innere Funktionsweise etwas anders. Hier geht es nicht darum, eine sichere Kommunikationslinie zu schaffen. Wir wollen nur eine Richtung prüfen. Der Softwareentwickler versucht nicht, den Inhalt des Softwarepakets zu verbergen. Ihn interessiert lediglich der Nachweis der Herkunft des Pakets.
Daher erstellt der Entwickler ein Paar privater und öffentlicher Schlüssel. Denken Sie daran, dass es sich dabei um zwei verschiedene Schlüssel handelt, die jedoch mathematisch verwandt sind und es unmöglich ist, einen Schlüssel vom anderen zurückzuentwickeln.
Der Entwickler verwendet seinen privaten Schlüssel, um das Softwarepaket zu verschlüsseln. Diese verschlüsselte Kopie kann nur mit dem öffentlichen Schlüssel entschlüsselt werden, den er bereits im Internet veröffentlicht hat. Wenn Sie und ich also einen öffentlichen Schlüssel zum Entschlüsseln dieser Kopie verwenden, können wir absolut sicher sein, dass sie vom Entwickler gesendet wurde, da er nur über den privaten Schlüssel verfügt, der sein Softwarepaket ursprünglich hätte verschlüsseln können.
Die Segmentierung erleichtert die Arbeit
Nun, ich habe ein wenig gelogen. Es ist nicht praktikabel, ganze Softwarepakete zu verschlüsseln, da diese Dateien sehr groß werden können. Eine weitere clevere Möglichkeit, dieses Problem zu lösen, sind Hash-Funktionen. Hash-Funktionen sind mathematische Formeln, die aus einer Datei beliebiger Größe eine feste Länge an Zahlen und Buchstaben generieren.
Beispielsweise nimmt die SHA256-Hash-Funktion eine beliebige Datei und gibt eine Liste mit 256 Zahlen und Buchstaben aus. Würde sich diese Datei auch nur ein bisschen ändern, würde das zu einem völlig anderen Ergebnis führen. Daher führt der Entwickler das Softwarepaket über die SHA256-Funktion aus, um eine Textdatei zu generieren. Anstatt das gesamte Paket zu verschlüsseln, wird lediglich die Textdatei mit einem privaten Schlüssel verschlüsselt (wie oben erläutert). Anschließend hängt der verschlüsselte Hash-Text an das Softwarepaket an und sendet ihn an uns.
Wenn Sie und ich das Softwarepaket erhalten, lassen wir es auch über SHA256 laufen, um unsere Hash-Liste zu erhalten. Anschließend entschlüsseln wir die dem Softwarepaket beigefügte verschlüsselte Nachricht mit dem vom Entwickler bereitgestellten öffentlichen Schlüssel. Wenn die entschlüsselte Hash-Liste mit der von uns generierten übereinstimmt, können wir absolut sicher sein, dass dieses Paket vom Entwickler stammt und nicht manipuliert wurde. Jede Manipulation des Pakets während des Transports führt zu einem völlig anderen Hash-Text. Diese Textdateien werden Validierungssätze genannt.
Kurz gesagt, genau das stellt eine Softwaresignatur dar: einen verschlüsselten Hash und einen öffentlichen Schlüssel. Eine digitale Signatur funktioniert, weil sie fälschungssicher (der private Schlüssel stellt dies sicher) und überprüfbar (der zugehörige öffentliche Schlüssel kann die Nachricht entschlüsseln) ist.
Wer beobachtet die Monitore?
Wenn Sie aufmerksam sind, ist Ihnen möglicherweise ein Fehler in diesem System aufgefallen, den wir noch nicht behoben haben.
Was passiert, wenn jemand eine Kopie des Softwarepakets entwendet, sie manipuliert, eine neue Prüfsumme erstellt und ein neues Schlüsselpaar zum Verschlüsseln verwendet? Dieser Bedrohungsakteur könnte den entsprechenden öffentlichen Schlüssel veröffentlichen oder ihn direkt an uns senden. Wir entschlüsseln die gefälschte Signatur mithilfe des öffentlichen Schlüssels und gehen davon aus, dass die Hashes identisch sind, sie also vom ursprünglichen Autor stammen müssen. Aber der öffentliche Schlüssel, den wir verwendeten, stammte von einem Betrüger.
Hier kommen Zertifizierungsbehörden ins Spiel. Eine vertrauenswürdige Organisation wie diese überprüft Entwickler und stellt ihnen digitale Zertifikate zur Verfügung, die an ihre öffentlichen Schlüssel gebunden sind. Sie signieren das Zertifikat kryptografisch, genau wie es der Entwickler für uns tut, und die höchste Zertifizierungsstelle garantiert die Signierung dieser Organisation. Sie sind durch und durch Zertifizierungsorganisationen.
Diese Zertifikate sind rechtsverbindlich und wir können sie unsererseits überprüfen, um absolut sicherzustellen, dass wir über die richtigen öffentlichen Schlüssel verfügen.
All diese Dinge geschehen automatisch im Hintergrund, da der Computer den Hashing-, Verschlüsselungs- und Verifizierungsprozess übernimmt. Wir sehen lediglich ein Dialogfeld, in dem wir um unsere Erlaubnis zur Installation oder Aktualisierung der App gebeten werden. Wenn die Anwendung nicht signiert ist, warnt uns das Betriebssystem vor der Installation.
Softwaresignaturen sind ein wesentlicher Bestandteil der digitalen Sicherheitsinfrastruktur und sorgen für Vertrauen in die Anwendungen, die wir täglich nutzen. Indem Entwickler und Benutzer verstehen, wie es funktioniert und wie es Software vor Manipulation schützt, können sie sicherstellen, dass sie sichere und zuverlässige Software verwenden.