Frage:
Wie wird das in TLS verwendete Premaster-Geheimnis generiert?
previouslyactualname
2014-07-26 01:00:12 UTC
view on stackexchange narkive permalink

Ich glaube, dass es eine Kombination der Zufallswerte verwendet, die in den Hallo-Nachrichten gesendet werden. Ab RFC 2246: (TLSv1.0)

  RSA-verschlüsselte geheime Premaster-Nachricht Bedeutung dieser Nachricht: Wenn RSA für die Schlüsselvereinbarung und -authentifizierung verwendet wird, generiert der Client ein 48-Byte-Premaster-Geheimnis. verschlüsselt es mit dem öffentlichen Schlüssel aus dem Serverzertifikat oder dem temporären RSA-Schlüssel, der in einer Serverschlüsselaustauschnachricht enthalten ist, und sendet das Ergebnis in einer verschlüsselten geheimen Premaster-Nachricht. Diese Struktur ist eine Variante der Client-Schlüsselaustauschnachricht, keine Nachricht an sich. Struktur dieser Nachricht: struct {ProtocolVersion client_version; undurchsichtiger Zufall [46]; } PreMasterSecret; client_version Die neueste (neueste) Version, die vom Client unterstützt wird. Dies wird verwendet, um Versions-Rollback-Angriffe zu erkennen. Nach Erhalt des Premaster-Geheimnisses sollte der Server überprüfen, ob dieser Wert mit dem vom Client in der Client-Hallo-Nachricht übertragenen Wert übereinstimmt. random 46 sicher generierte zufällige Bytes.  

Wie wird es mit dem Wert übereinstimmen, den der Client zuvor gesendet hat? Kann das bitte jemand erklären? Danke! Gibt es eine API, um diesen Wert zu berechnen?

Zwei antworten:
Tom Leek
2014-07-26 03:52:55 UTC
view on stackexchange narkive permalink

Der Client generiert das 48-Byte-Premaster-Geheimnis durch Verketten der Protokollversion (2 Byte) und einiger vom Client zufällig generierter Byte (46 Byte). Der Client soll diese 46 Bytes von einem kryptografisch sicheren PRNG erhalten. In der Praxis bedeutet dies, dass das vom Betriebssystem angebotene PRNG verwendet wird ( / dev / urandom , CryptGenRandom()...).

Der Client Anschließend wird das 48-Byte-Premaster-Geheimnis mit dem öffentlichen RSA-Schlüssel des Servers verschlüsselt (den der Server zuvor in der Nachricht Certificate an den Client gesendet hat). Das verschlüsselte Ergebnis wird vom Client als ClientKeyExchange -Nachricht an den Server gesendet. Da RSA ein solider asymmetrischer Verschlüsselungsalgorithmus ist, entspricht das, was der Server entschlüsselt, dem, was der Client verschlüsselt hat.

Der Server entschlüsselt den Inhalt der Nachricht ClientKeyExchange mit seinen privaten RSA-Schlüssel. Zu diesem Zeitpunkt kennen sowohl Client als auch Server das Premaster-Geheimnis. Anschließend berechnen sie damit das Hauptgeheimnis (unter Verwendung des client_random und des server_random , die zuvor im ClientHello und ServerHello Nachrichten und Mischen des Ganzen mit dem PRF). Aus dem Hauptgeheimnis werden sie wieder etwas PRF-Mischen verwenden, um die tatsächlichen Verschlüsselungsschlüssel für nachfolgende Daten zu erhalten.

harshc
2016-10-03 06:38:09 UTC
view on stackexchange narkive permalink

TLS unterstützt mehrere Schlüsselaustauschschemata und daher gibt es verschiedene Möglichkeiten, ein Pre-Master-Geheimnis abzuleiten. TLS kann einen RSA-basierten Schlüsselaustausch verwenden, der im vorherigen Kommentar ziemlich gut erläutert wurde. Es kann auch DH, DHE, ECDH, ECDHE (Diffie-Hellman, Diffie-Hellman mit kurzlebigen Schlüsseln, Diffie-Hellman mit elliptischer Kurve und Ecdh mit kurzlebigen Schlüsseln) verwenden beziehungsweise).

In der DH-Familie von Algorithmen wird das Premaster-Geheimnis aus zwei Wertegruppen generiert:

  1. Vom Server ausgewählte öffentliche Grundelemente
  2. Private Schlüssel des Absender und Empfänger
  3. ol>

    Der Server teilt die öffentlichen Grundelemente, die der Client verwendet, zusammen mit seinem privaten Schlüssel, um ein Pre-Master-Geheimnis zu erstellen. Im Fall von Diffie Hellman ist es ungefähr so:

    Öffentliche Primitive :

      p - eine große Primzahl g - primitives Wurzelmodulo p  

    Private Schlüssel:

      a - privater Schlüssel des Clients - privater Schlüssel des Servers  

    Schlüsselaustausch:

      Server zu Client: {g, p, (g ^ b mod p)} Client Berechnet: (g ^ b mod p) ^ a = g ^ ab mod pClient to Server: (g ^ a mod p) Server Berechnet: (g ^ a mod p) ^ b = g ^ ab mod p  

    Wenn Sie genau hinschauen, werden beide Server und Client haben jetzt einen gemeinsamen Schlüssel (g ^ ab mod p) , den sie als Pre-Master-Geheimnis verwenden können.

    Dieses Pre-Master-Geheimnis kann einem HKDF zugeführt werden, um mehrere kryptografisch sichere Schlüssel zu extrahieren. Diese Schlüssel können dann als Sitzungsverschlüsselungsschlüssel, hmac-Schlüssel (oder IVs basierend auf der Verschlüsselungsverschlüsselung) verwendet werden.

    Elliptische Kurve DH verwendet anstelle von Grundelementen wie p und g benannte elliptische Kurven.

    Für Ihre andere Frage

    Gibt es eine API, um diesen Wert zu berechnen?

    Wenn Sie einen kryptografisch sicheren Zufallswert gemeint haben , dann ja, Python hat os.urandom (n)

    , mit dem eine Krypto mit n Bytes generiert werden kann. sicherer Zufallswert.



Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 3.0-Lizenz, unter der er vertrieben wird.
Loading...