Frage:
Ist diese RSA / AES-Kombination gut?
Adrian Sicaru
2015-07-14 17:01:07 UTC
view on stackexchange narkive permalink

Das Entwicklerteam, dem ich angehöre, versucht, einen sicheren Weg zum Austausch sensibler Daten zwischen einem Server und mobilen Geräten zu entwickeln.

Wir haben den folgenden Algorithmus entwickelt:

  • Gerät generiert einen privaten RSA-Schlüssel und sendet den öffentlichen Schlüssel an den Server.

  • Der Server generiert einen eindeutigen AES-Schlüssel für den Benutzer und verwendet den öffentlichen RSA-Schlüssel für verschlüsseln Sie es und senden Sie es an das Gerät zurück.

  • Das Gerät erhält den AES-Schlüssel. Verwendet es zum Verschlüsseln von Kennwort und Benutzername und sendet es an den Server.

  • Der Server entschlüsselt den Benutzernamen und das Kennwort. Wenn eine Übereinstimmung vorliegt, wird der AES-Schlüssel für die sichere Kommunikation für X Zeit oder bis zum Abmelden verwendet. Andernfalls muss der Prozess neu gestartet werden.

  • ol>

    Ist er sicher genug? Gibt es Möglichkeiten, wie es verbessert werden kann? Was sind die Fehler?

    Bearbeiten: Was ist nach dem Lesen der Kommentare eine sicherere Alternative und warum?

    Bearbeiten2: Ok, ich verstehe . Ich werde meine eigene Implementierung nicht verwenden, sondern etwas finden, das sich bereits bewährt hat.

    ** BITTE ROLLEN SIE IHREN EIGENEN CRYPTO / IHRE SICHERHEIT NICHT **. Was ist los mit [SRP] (https://en.wikipedia.org/wiki/Secure_Remote_Password_protocol) und [TLS] (https://en.wikipedia.org/wiki/Transport_Layer_Security)?
    Wir alle sind neu in der Kryptographie und die Erstellung eines eigenen Kryptoprotokolls scheint eine gute Idee zu sein
    Fehler: Kein MITM-Schutz (* "Gerät sendet öffentlichen Schlüssel an Server" *), extreme Arbeitsbelastung (das Generieren privater RSA-Schlüssel ist teuer), Server muss Passwort in * normal * speichern, Sie erwähnen nicht einmal * Authentifizierung / Integrität * .
    * Wir alle sind neu in der Kryptographie und die Erstellung unseres eigenen Kryptoprotokolls scheint eine gute Idee zu sein * - Das hat mich sehr schockiert. Sie wissen nicht, was Sie in Krypto tun sollen, und möchten aus diesem Grund Ihr eigenes Protokoll erstellen!? (Hinweis: * wirklich * schlechte Idee)
    Adrian - bitte lesen Sie: http://meta.security.stackexchange.com/a/915/485
    Um Ihr Update zu beheben, sollten Sie am besten einen Berater beauftragen, der Ihre Anforderungen ermittelt und Empfehlungen abgibt.
    Zusätzlich zu dem, was alle anderen sagen, klären Sie mich bitte auf. Was passiert, wenn Sie alle zu größeren und besseren Dingen übergehen? Wird dieses Protokoll laufend unterstützt? Wenn eine Schwäche oder ein Fehler entdeckt wird, kann sich das Unternehmen dann darauf verlassen, dass Sie die Probleme beheben? Wird dies veröffentlicht (Open Source) und kontinuierlich aktualisiert, wenn Community-Mitglieder sich bemühen, es zu verbessern?
    Beachten Sie auch dieses Zitat: "Wenn Sie der Meinung sind, dass Kryptografie die Lösung für Ihr Problem ist, verstehen Sie Kryptografie nicht und Sie verstehen Ihr Problem nicht" - Roger Needham und Butler Lampson
    @AdrianSicaru Die Leute bei StackExchange müssen wirklich die Möglichkeit hinzufügen, Kommentare herunterzustimmen, nur damit wir abstimmen können "Wir alle sind neu in der Kryptographie und die Erstellung unseres eigenen Kryptoprotokolls scheint eine gute Idee zu sein". Es ist eine wirklich, wirklich schlechte Idee.
    RSA + AES ist eine gute Kombination. Das in Ihrer Frage beschriebene Protokoll ist dies jedoch nicht. Ihnen fehlt Integrität und Geheimhaltung.
    @mikeazo Bedeutet das, dass Kryptographie die Lösung für keine Probleme ist?
    @immibis, Ich würde sagen, es ist keine Lösung, nur ein Kompromiss. Es mag ein guter Kompromiss sein, aber zu wissen, dass dies wirklich ein gutes Verständnis der Kryptographie und des vorliegenden Problems erfordert.
    Nach der Anzahl der Ansichten zu urteilen, hatten wohl viele zu viel Angst, diese Art von Frage zu stellen.
    Nicht wirklich. Diese Frage hat viele Aufrufe erhalten, da sie in Hot Network Questions eingegangen ist, bei denen Benutzer auf verschiedenen SE-Websites zu diesem Beitrag gehen und ihn lesen (und abstimmen) können.
    Im Moment werde ich mich an die ausgetretenen Pfade halten, aber für die Zukunft wäre es interessant, meinen eigenen Weg in der Testumgebung zu versuchen. Zum Spaß zuerst und wer weiß, vielleicht wird sich eines Tages etwas Schönes entwickeln
    Fünf antworten:
    Thomas Pornin
    2015-07-14 17:20:00 UTC
    view on stackexchange narkive permalink

    Alle Schwachstellen in Ihrem Protokoll können als "SSL verwenden" oder sogar "SSL verwenden, verdammt!" zusammengefasst werden.

    Weitere Informationen:

    • Das gesamte Protokoll ist natürlich anfällig für Identitätswechsel, insbesondere für den doppelten Identitätswechsel, der auch als Man-in-the-Middle-Angriff bezeichnet wird.
    • Ebenso, wenn einer der potenziellen Angreifer dies tut kann lauschen auf der Linie beschließt, eine Änderung der Daten während der Übertragung vorzunehmen, dann kann er, und Ihr Client und Server werden nicht klüger sein.
    • Die Erfahrung zeigt, dass " Alle Daten mit diesem Schlüssel verschlüsseln "und dann richtig zu machen, ist furchtbar komplex. SSL selbst hat fast 15 Jahre dafür gebraucht, und viele Implementierungen sind immer noch nicht in der Lage. Auffüllen von Orakeln, vorhersehbare IV, MAC-Überprüfungszeitpunkt, verifizierter Abschluss, Schutz vor erneuter Sequenzierung und Wiedergabe von Paketen ...

    Als Gesamtbewertung: Tun Sie das nicht.

    Sicherlich meinst du TLS und nicht SSL. [Wikipedia: Transport Layer Security: SSL 1.0, 2.0 und 3.0] (https://en.wikipedia.org/wiki/Transport_Layer_Security#SSL_1.0.2C_2.0_and_3.0) "Ab 2014 gilt die 3.0-Version von SSL als unsicher ... "" SSL 2.0 ist veraltet ... "" SSL 3.0 ist veraltet ... "
    Ich verwende "SSL", um die Protokollfamilie zu bestimmen, die von SSL 3.0 zu TLS 1.2 reicht. Die übliche Terminologie "SSL vs TLS" ist nicht gut. Weitere Informationen finden Sie unter [this] (http://meta.crypto.stackexchange.com/questions/544/should-we-still-use-ssl-as-tag-instead-of-tls/549#549).
    Fair genug dort. Aber in diesem speziellen Fall möchten Sie vielleicht etwas expliziter sein und sagen "Verwenden Sie eine moderne / standardisierte Variante von SSL"? Wie auch immer, kleine Details im großen Schema der Dinge.
    Die Verwendung von SSL behandelt nicht die Frage, wie ein Kennwort überprüft werden kann. Wie wir wissen, kann die Kennwortüberprüfung sehr unsicher durchgeführt werden, selbst wenn die SSL-verschlüsselte Kommunikation nicht unterbrochen ist. Für ein neues System, das nicht an Abwärtskompatibilitätsanforderungen gebunden ist, würde ich die Verwendung einer Kennwortüberprüfungsmethode empfehlen, bei der der Server das Kennwort nie klar sieht. Ihre Antwort könnte verbessert werden, wenn Sie dieser Eigenschaft eine Empfehlung einer Standardmethode zur Kennwortüberprüfung hinzufügen würden.
    Das klare Löschen des Kennworts auf der Serverseite ist kein Problem, solange garantiert wird, dass der Client mit dem echten Server spricht (das Serverzertifikat in SSL wird dafür verwendet), und der Server einen eingehenden Kennwort-Hash berechnet Passwörter, um sie mit einem gespeicherten Wert zu vergleichen (die übliche Empfehlung für diesen Passwort-Hash ist bcrypt, natürlich KEINE hausgemachte Konstruktion). Ein erweitertes Protokoll würde den Client veranlassen, den Großteil des bcrypt-Werts zu berechnen, dies würde jedoch nur mit rechnerisch leistungsfähigen Clients funktionieren.
    @ThomasPornin Dies gilt unter der Annahme, dass Server niemals kompromittiert werden und Benutzer niemals Passwörter wiederverwenden. Es ist bekannt, dass beide Annahmen in der Praxis nicht zutreffen. Wenn Benutzer Kennwörter wiederverwenden und Server kompromittiert werden können, ist es eine Schwachstelle, wenn der Server das Kennwort klar sieht.
    SEJPM
    2015-07-14 17:19:02 UTC
    view on stackexchange narkive permalink

    Nein, dieses Protokoll ist nicht sicher.

    Wie bereits in den Kommentaren erwähnt:

    Rollen Sie keine eigene Krypto. Wahrscheinlich verstehen Sie es falsch. Besonders wenn Sie zugeben, dass Sie nicht wirklich wissen, was Sie tun.

    Erstens scheinen Sie Standardprobleme zu haben, für die es bereits Standardprotokolle gibt, die nette Eigenschaften und Sicherheitsnachweise haben . Das Protokoll für die Datenübertragung sollte TLS v1.2 (oder neuer) sein. Sie sollten hierfür eine Bibliothek verwenden (wie NSS, GnuTLS oder OpenSSL). Für die Kennwortauthentifizierung verwenden Sie am besten SRP oder TLS-SRP. Wenn Sie sich SRP jedoch wirklich nicht leisten können (was Ihre erste Wahl sein sollte), können Sie trotzdem diesem Dokument folgen.
    Bisher für die Verbesserungen.

    Nun zum Fehler Ihres Protokolls:

    1. Es ist anfällig für Man-in-the-Middle-Angriffe. Wenn sich ein Angreifer zwischen dem Gerät und dem Server befindet, kann er den öffentlichen Schlüssel fischen und durch seinen eigenen ersetzen. Als Antwort würde er den AES-Schlüssel kennen und alle Daten entschlüsseln können.
    2. Sie erwähnen nicht die Integrität / Authentizität der Daten. Es hört sich so an, als ob Sie den EZB-Modus für AES verwenden möchten (den Sie wirklich nicht verwenden möchten ). Mit AES wären Sie viel besser dran -GCM für die Massenverschlüsselung. Sie erwähnen auch nicht, wie RSA verwendet werden soll. RSA-OAEP sollte Ihre Wahl sein (und nicht Lehrbuch-RSA). Ich gehe jedoch davon aus, dass Sie dies mit Ihrer Implementierung getan hätten.
    3. Sie haben das Gerät sehr stark belastet. Das Gerät muss bei jeder Verbindung einen neuen privaten RSA-Schlüssel generieren, was eine sehr rechenintensive Aufgabe ist. Sie sollten lieber die Verwendung des ECDH-Schlüsselaustauschs in Betracht ziehen.
    4. Damit die Überprüfung der Kennwörter funktioniert, muss der Server die Kennwörter entweder im Klartext speichern oder selbst hashen, um DoS-Angriffe auf den Server zu ermöglichen. Und falls ein Man-in-the-Middle-Angriff stattfindet, werden die einfachen Passwörter einem Angreifer angezeigt, was Ihren Benutzern ernsthaften Schaden zufügen kann (da sie ihre Passwörter möglicherweise standortübergreifend wiederverwenden ...)
    5. ol>
    Was (4) betrifft, bin ich mir nicht sicher, was schlimmer ist: Speichern von Passwörtern im Klartext oder (zumindest in den Augen eines aktiven Angreifers im Wesentlichen und sicherlich für den Server) Senden von Passwörtern im Klartext ...
    @MichaelKjörling fügte die Wiederherstellung von Passwörtern im Falle eines aktiven Angriffs hinzu. Vielen Dank.
    StackzOfZtuff
    2015-07-14 17:13:48 UTC
    view on stackexchange narkive permalink

      Das Gerät generiert einen privaten RSA-Schlüssel und sendet den öffentlichen Schlüssel an den Server.

    1. Der Server generiert einen eindeutigen AES-Schlüssel für den Benutzer und verwendet den Öffentlicher RSA-Schlüssel zum Verschlüsseln und Zurücksenden an das Gerät.

    2. Das Gerät erhält den AES-Schlüssel. Verwendet es zum Verschlüsseln von Kennwort und Benutzername und sendet es an den Server.

    3. ol>

    Anonymer Schlüsselaustausch.

    Es erfolgt keine Authentifizierung. Ihr Schlüsselaustausch ist verschlüsselt, aber nicht authentifiziert. Das ist schlecht.

    Wenn es einen aktiven Mann in der Mitte gibt, haben Sie keine Möglichkeit, dies zu erkennen. Dieser aktive MitM kann dem Client nur so tun, als sei er der Server. Und tun Sie dem Server gegenüber so, als sei er der Client.

    -> Tun Sie es nicht. @ SEJPM stimmt mit seinem Kommentar überein. Verwenden Sie etablierte Kryptosysteme. Wie TLS mit Zertifikaten oder TLS mit SRP.

    chings228
    2016-04-24 13:01:16 UTC
    view on stackexchange narkive permalink

    Auf diese Weise verwende ich eine RSA / AES-Kombination.

    1. Client generiert einen zufälligen AES-Schlüssel.
    2. Verwenden Sie den AES-Schlüssel, um die benötigten Daten zu verschlüsseln (RSA Take) längere Zeit und Längenbeschränkung, verwenden Sie also besser aes zum Verschlüsseln.)
    3. Verwenden Sie den öffentlichen Schlüssel zum Verschlüsseln des aes-Schlüssels.
    4. Übergeben Sie die verschlüsselten Daten und den von rsa public verschlüsselten aes-Schlüssel Schlüssel zum Server
    5. Wenn der Server empfängt, entschlüsseln Sie diesen AES-Schlüssel mit einem privaten Schlüssel und entschlüsseln Sie dann die angehängten Daten mit dem entschlüsselten AES-Schlüssel
    Erez
    2015-07-14 17:14:40 UTC
    view on stackexchange narkive permalink

    Es ist ziemlich gut, aber ich würde dies auf eine einfachere Art und Weise tun, die meiner Meinung nach sicherer und ähnlicher ist als die, an die Sie gedacht haben.

    Da die Kommunikation Client-Server ist:

    1. Mobiler Client generiert Schlüssel mit PRNG
    2. Client sendet Schlüssel für Schritt 1 mit öffentlichem Serverschlüssel (nur Server muss privat entschlüsselt werden)
    3. Client verschlüsselt Benutzer / Kennwort mit Schlüssel für Schritt 1 und sendet an Server
    4. Wenn Benutzer / Passwort überprüft wurden, gibt der Server einen neuen Schlüssel für die Datenverschlüsselung zurück, der mit dem Schlüssel von Schritt 1
    5. ol>

      - verschlüsselt ist. Bitte führen Sie Schritt 2 - 4 über TLS aus, wenn möglich

      -. Ändern Sie die Schlüssel alle X-Iterationen (auf Client und Server erzwingen)

      ---. Der Client muss dem Serverzertifikat vertrauen, um MITM / Identitätswechsel

      zu verhindern
    "Bitte tauschen Sie den Schlüssel über TLS aus". Nun ... das ist sicher. Aber warum genau brauchen Sie dann Ihren eigenen Schlüsselaustausch?
    Möglicherweise kann er SSL / TLS nicht für den Datenaustausch verwenden oder er verwendet möglicherweise schwache Cipher Suites.
    Warum sollte er SSL verwenden können, um Daten zu authentifizieren, aber nicht zu übertragen?
    verschiedene Server, topologieabhängig


    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...