26 Stimmen

Kann man mit einem privaten Schlüssel verschlüsseln und mit einem öffentlichen Schlüssel entschlüsseln?

(Disclaimer: Ich weiß, wenn Sie etwas über Krypto wissen, werden Sie mir wahrscheinlich sagen, warum ich es falsch mache - ich habe genug gegoogelt, um zu wissen, dass dies die typische Antwort zu sein scheint.]

Stellen Sie sich Folgendes vor: Sie haben eine zentrale Behörde, die Anmelde-Cookies für einen bestimmten Bereich ausstellen möchte. Auf dieser Domäne vertrauen Sie nicht unbedingt jedem, aber Sie haben ein paar wichtige Endpunkte, die in der Lage sein sollten, das Cookie zu lesen. Ich sage "einige", aber in der Praxis kann die Zahl der "vertrauenswürdigen" Partner sehr groß sein. Das Cookie enthält nicht viele Informationen - einen Benutzernamen, einen Zeitstempel, ein Ablaufdatum, eine Zufallszahl. Er sollte natürlich aus Leistungsgründen klein bleiben, auch nach der Verschlüsselung (in einem vernünftigen Rahmen). Nun gibt es zwei Sicherheitsprobleme:

1) Wir vertrauen nicht jedem Webserver in dieser Domäne die Benutzerdaten an. Aus diesem Grund sollte die Möglichkeit, das Cookie zu lesen, auf diese vertrauenswürdigen Partner beschränkt werden. 2) Wir vertrauen diesen Partnern zwar, dass sie die Daten unserer Nutzer schützen, möchten aber dennoch, dass die zentrale Stelle fälschungssicher ist (wiederum in einem vernünftigen Rahmen).

Wenn wir nun einen privaten RSA-Schlüssel für die Behörde generieren und ihn geheim halten und den öffentlichen Schlüssel nur an die "vertrauenswürdigen Partner" weitergeben, sollten wir in der Lage sein, mit dem privaten Schlüssel zu verschlüsseln und ihn für jeden lesbar zu machen, der den öffentlichen Schlüssel hat. Was mir nicht ganz klar ist: Müsste die Nachricht immer noch signiert werden, oder wäre die Entschlüsselung ein Beweis dafür, dass sie mit dem privaten Schlüssel erzeugt wurde? Wäre dieses Schema in irgendeiner Weise besser oder schlechter als die Verbreitung eines symmetrischen Schlüssels an alle beteiligten Parteien und die Verwendung dieses Schlüssels zum Verschlüsseln, während der private Schlüssel lediglich zum Signieren verwendet wird? Und natürlich können Sie mir gerne sagen, wie dumm diese Idee ist, aber bedenken Sie, dass praktische Argumente wahrscheinlich überzeugender sind als das Aufwärmen von Alice und Bob.

Oh, und Hinweise zur Implementierung wären willkommen, auch wenn man die Grundlagen bei Google finden kann, wenn es irgendwelche Probleme gibt, wäre das sehr hilfreich!

20voto

caf Punkte 224189

Nate Lawson erklärt aquí y aquí warum Sie den öffentlichen Schlüssel nicht sicher als streng geheimen Entschlüsselungsschlüssel verwenden können (das ist ein subtiler Punkt, und ein Fehler, den viele andere vor Ihnen gemacht haben, also fühlen Sie sich nicht schlecht!)

Verwenden Sie einfach Ihren öffentlichen Schlüssel zum Signieren für die Authentizität und einen separaten symmetrischen Schlüssel für die Geheimhaltung.

Ich habe genug über interessante Angriffe auf öffentliche Schlüsselsysteme und insbesondere RSA gelesen, um dieser Schlussfolgerung absolut zuzustimmen:

Kryptosysteme mit öffentlichem Schlüssel und RSA in sind extrem anfällig. Muss sie nicht anders verwenden, als sie konzipiert wurden.

(Das bedeutet: Verschlüsseln mit dem öffentlichen Schlüssel, Signieren mit dem privaten Schlüssel, alles andere ist ein Spiel mit dem Feuer).

Nachtrag:

Wenn Sie daran interessiert sind, die Größe der resultierenden Cookies zu reduzieren, sollten Sie die Verwendung von ECDSA anstelle von RSA zur Erstellung der Signaturen in Erwägung ziehen - ECDSA-Signaturen sind erheblich kleiner als RSA-Signaturen mit einem vergleichbaren Sicherheitsfaktor.

5voto

M.A. Hanin Punkte 7876

Sie sollten eine Art digitales Siganturensystem oder einen anderen Mechanismus verwenden, der darauf abzielt, das Problem zu lösen. Integrität Problem Ihres Szenarios.

Die Verschlüsselung selbst ist nicht genug. Woher wollen Sie wissen, dass die entschlüsselte Nachricht das ist, was sie sein soll? Die Entschlüsselung eines mit dem richtigen Schlüssel verschlüsselten Cookies liefert mit Sicherheit ein "gültiges" Cookie, aber was passiert, wenn Sie ein Cookie entschlüsseln, das mit dem falschen Schlüssel verschlüsselt wurde? oder einfach nur mit bedeutungslosen Daten? nun, Sie könnten ein Cookie erhalten, das gültig aussieht! (die Zeitstempel liegen in dem Bereich, den Sie für gültig halten, der Benutzername ist legal, die Zufallszahl ist... äh... eine Zahl, usw.).

Bei den meisten asymmetrischen Verschlüsselungsalgorithmen, die ich kenne, gibt es keine eingebaute Validierung. Das bedeutet, dass die Entschlüsselung einer Nachricht mit einem falschen Schlüssel nicht "fehlschlägt", sondern nur einen falschen Klartext ergibt, der Sie von einem gültigen Klartext unterscheiden muss. Hier kommt die Integrität ins Spiel, am häufigsten durch digitale Signaturen.

Nebenbei bemerkt, RSA ist lange erforscht und hat einige "Tücken". Wenn Sie also vorhaben, es von Grund auf zu implementieren, sollten Sie sich darüber informieren, wie Sie vermeiden, "relativ leicht zu knackende" Schlüssel zu erstellen.

1voto

Broam Punkte 4548

Öffentliche Schlüssel sind per Definition öffentlich. Wenn Sie mit einem privaten Schlüssel verschlüsseln und mit einem öffentlichen Schlüssel entschlüsseln, ist das nicht sicher vor neugierigen Blicken. Es heißt nur: "Diese Daten stammen von Person X, die den privaten Schlüssel X besitzt" und Jeder kann das nachprüfen, denn die andere Hälfte des Schlüssels ist öffentlich.

Was hindert jemanden, dem Sie nicht vertrauen, daran, den öffentlichen Schlüssel X auf einen Server zu legen, dem Sie nicht vertrauen?

Wenn Sie eine sichere Kommunikationsverbindung zwischen zwei Servern wünschen, müssen alle diese vertrauenswürdigen Server ihre eigenen öffentlichen/privaten Schlüsselpaare haben, z. B. Schlüsselpaar Y für einen solchen Server.

Server X kann dann eine Nachricht mit dem privaten Schlüssel X und dem öffentlichen Schlüssel Y verschlüsseln. Dies bedeutet, dass Server X eine Nachricht gesendet hat, die nur Y lesen konnte, und Y konnte überprüfen, dass sie von X stammt.

(Und diese Nachricht sollte einen kurzlebigen symmetrischen Schlüssel enthalten, da die Verschlüsselung mit öffentlichen Schlüsseln sehr zeitaufwändig ist.)

Das ist die Aufgabe von SSL. Es verwendet Public Key Crypto, um einen Sitzungsschlüssel einzurichten.

Trotzdem sollten Sie eine Bibliothek benutzen. Dieses Zeug ist leicht zu vermasseln.

1voto

Babu Srinivasan Punkte 2249

Die Antwort auf Ihre Frage "Wäre die Entschlüsselung ein Beweis dafür, dass sie mit dem privaten Schlüssel erzeugt wurde? Die Antwort lautet ja, wenn der Empfänger eine einfache Validierung der Daten vornehmen kann. Nehmen wir an, Sie haben "Benutzername: John, Zeitstempel: <Zahl>, Ablaufdatum: tt/mm/jjjj". Wenn nun ein falscher öffentlicher Schlüssel zum Entschlüsseln verwendet wird, ist die Wahrscheinlichkeit, dass Sie "Benutzername: <einige Buchstaben>, Zeitstempel: <nur Zahlen>, Ablaufdatum: ??/??/????" erhalten, gleich Null. Sie können mit einem regulären Ausdruck (regex) wie "Benutzername : [a-zA-Z]+, Zeitstempel : [0-9]+, Ablauf : .... " und lassen Sie die Validierung fehlschlagen. Sie können sogar prüfen, ob der Tag zwischen 1 und 31 und der Monat zwischen 1 und 12 liegt, aber Sie werden es nicht verwenden können, da die Regex normalerweise bei "Benutzername : " fehlschlägt, wenn der falsche öffentliche Schlüssel verwendet wird. Wenn die Validierung erfolgreich ist, müssen Sie immer noch den Zeitstempel überprüfen und sicherstellen, dass Sie keinen Replay-Angriff haben.

Bedenken Sie jedoch Folgendes:

  1. Die RSA-Verschlüsselung mit öffentlichem Schlüssel ist nicht für die Massenverschlüsselung strukturierter Daten geeignet, da sie von Angreifern ausgenutzt werden kann. Die Verschlüsselung mit öffentlichem Schlüssel wird in der Regel auf 2 Arten verwendet: 1) für den sicheren Transport des symmetrischen Schlüssels (der definitionsgemäß keine Struktur hat), der bei der Massenverschlüsselung verwendet wird; dies geschieht durch Verschlüsselung des symmetrischen Schlüssels mit dem öffentlichen Schlüssel und 2) für die digitale Unterzeichnung eines Dokuments, indem nicht das Dokument, sondern der Hash des Dokuments (ebenfalls etwas, das keine Struktur hat) mit dem privaten Schlüssel verschlüsselt wird. In Ihrem Fall verschlüsseln Sie den Cookie, der eine eindeutige Struktur hat.
  2. Sie sind darauf angewiesen, dass der öffentliche Schlüssel nicht in die Hände der falschen Person oder Einrichtung gerät.
  3. Die Verschlüsselung mit öffentlichen Schlüsseln ist etwa 1000 Mal langsamer als die Verschlüsselung mit symmetrischen Schlüsseln. Dies spielt in Ihrem Fall möglicherweise keine Rolle.

Wenn Sie diesen Ansatz dennoch verwenden möchten und in der Lage sind, den öffentlichen Schlüssel zu verteilen nur an die "vertrauenswürdigen Partner" zu senden, sollten Sie einen zufälligen Sitzungsschlüssel (d. h. einen symmetrischen Schlüssel) erzeugen, ihn mit dem privaten Schlüssel verschlüsseln und an alle Empfänger senden, die den öffentlichen Schlüssel besitzen. Anschließend verschlüsseln Sie das Cookie mit dem Sitzungsschlüssel. Sie können den Sitzungsschlüssel in regelmäßigen Abständen ändern. In selteneren Fällen können Sie auch den öffentlichen Schlüssel ändern: Sie können ein neues öffentliches/privates Schlüsselpaar erzeugen und den öffentlichen Schlüssel mit dem Sitzungsschlüssel verschlüsseln und an alle Empfänger senden.

0voto

Nick Johnson Punkte 99799

Ich nehme an, Sie vertrauen darauf, dass die "vertrauenswürdigen Partner" das Cookie entschlüsseln und verifizieren, wollen aber nicht, dass sie ihre eigenen Cookies erzeugen können? Wenn das kein Problem ist, können Sie ein viel einfacheres System verwenden: Verteilen Sie einen geheimen Schlüssel an alle Parteien und verwenden Sie diesen, um das Cookie zu verschlüsseln und einen HMAC dafür zu generieren. Sie brauchen keine Verschlüsselung mit öffentlichem Schlüssel und auch nicht mehrere Schlüssel.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X