Wenn ein Benutzer auf einem Anmeldebildschirm ein Formular mit seinem Benutzernamen und Passwort sendet, wird das Passwort im Klartext gesendet (auch mit POST korrigieren Sie mich, wenn ich falsch liege).
Die Frage ist also, wie der Benutzer und sein Passwort richtig vor Dritten geschützt werden können, die möglicherweise die Kommunikationsdaten abhören.
Mir ist bekannt, dass HTTPS eine Lösung für das Problem darstellt. Gibt es jedoch eine Möglichkeit, mithilfe des Standard-HTTP-Protokolls (POST-Anforderung) zumindest ein gewisses Maß an Sicherheit zu gewährleisten? (Vielleicht mit Javascript in irgendeiner Weise)
BEARBEITEN Ich habe möglicherweise einige wichtige Dinge ausgelassen.
Worum es mir ging, war eine Seite - das ist eine von PHP generierte Anmeldeseite, die natürlich in einer HTTP-GET-Anfrage als HTML-Datei an den Benutzer gesendet wird. Es wurde keine (@ Jeremy Powel) Verbindung zwischen dem Server und dem Client hergestellt, daher kann ich kein solches Handshake-Protokoll erstellen. Und ich möchte, dass der gesamte Prozess für den Benutzer transparent ist - er möchte ein Passwort senden und sich nicht mit Kryptografie befassen.
Vielen Dank.
Antworten:
Die Verwendung von HTTP mit SSL erleichtert Ihnen das Leben erheblich und Sie können sich beruhigt ausruhen. Sehr kluge Leute (zumindest schlauer als ich!) Haben diese Methode der vertraulichen Kommunikation jahrelang überprüft.
quelle
Sichere Authentifizierung ist ein weites Thema. Kurz gesagt, wie @ jeremy-powell erwähnte, bevorzugen Sie immer das Senden von Anmeldeinformationen über HTTPS anstelle von HTTP. Es wird viele sicherheitsrelevante Kopfschmerzen beseitigen.
TSL / SSL-Zertifikate sind heutzutage ziemlich billig. In der Tat, wenn Sie überhaupt kein Geld ausgeben möchten, gibt es eine kostenlose letsencrypt.org - automatisierte Zertifizierungsstelle.
Sie können noch einen Schritt weiter gehen und caddyserver.com verwenden, das im Hintergrund letsencrypt aufruft.
Nun, sobald wir HTTPS aus dem Weg geräumt haben ...
Sie sollten Login und Passwort nicht über POST-Payload- oder GET-Parameter senden. Verwenden Sie stattdessen einen Autorisierungsheader (Standardzugriffsauthentifizierungsschema), der wie folgt aufgebaut ist:
Es mag etwas kompliziert erscheinen, ist es aber nicht. Es gibt viele gute Bibliotheken, die diese Funktionalität sofort für Sie bereitstellen.
Es gibt einige gute Gründe, warum Sie einen Autorisierungsheader verwenden sollten
https://user:[email protected]/login
(Chrome konvertiert es beispielsweise automatisch in einenAuthorization
Header.)WICHTIG:
Wie von @zaph in seinem Kommentar unten ausgeführt, ist das Senden vertraulicher Informationen als GET-Abfrage keine gute Idee, da sie höchstwahrscheinlich in Serverprotokollen landen.
quelle
Authorization
Header erstellt. Probieren Sie es einfach aus. Protokolle erinnern sauber. Und wenn Sie einen Anruf vom Server aus tätigen (wenn dies das Szenario ist, über das Sie sich Sorgen machen), sollten Sie den Header natürlich programmgesteuert generieren.username:password@url
vom Browser übersetzt in:url
+Authorization
Anforderungsheader. Was GET-Abfragen betrifft ... wie gesagt, verwenden Sie den Authroziation-Header. Es ist besser.Sie können ein Challenge-Response-Schema verwenden. Angenommen, der Client und der Server kennen beide ein geheimes S. Dann kann der Server sicher sein, dass der Client das Kennwort kennt (ohne es preiszugeben), indem er:
Bearbeiten:
Hier gibt es ein Problem mit der Frische von R und der Tatsache, dass HTTP zustandslos ist. Dies kann erreicht werden, indem der Server ein Geheimnis erstellt, das Q heißt und das nur der Server kennt . Dann geht das Protokoll so:Da H (R, Q) vom Client nicht gefälscht werden kann, fungiert H (R, Q) als Cookie (und könnte daher tatsächlich als Cookie implementiert werden).Noch eine Bearbeitung:
Die vorherige Bearbeitung des Protokolls ist falsch, da jeder, der H (R, Q) beobachtet hat, in der Lage zu sein scheint, es mit dem richtigen Hash wiederzugeben. Der Server muss sich merken, welche Rs nicht mehr frisch sind. Ich mache diese Antwort, damit ihr sie bearbeiten und etwas Gutes ausarbeiten könnt.
quelle
Wenn Ihr Webhost dies zulässt oder Sie mit vertraulichen Daten umgehen müssen, verwenden Sie HTTPS, Punkt. (Es wird oft vom Gesetz afaik vorgeschrieben).
Andernfalls, wenn Sie etwas über HTTP tun möchten. Ich würde so etwas tun.
Auf diese Weise ist das Kennwort geschützt und der gleiche Authentifizierungs-Hash kann nicht wiedergegeben werden.
Informationen zur Sicherheit des Sitzungstokens. Das ist etwas schwieriger. Es ist jedoch möglich, die Wiederverwendung eines gestohlenen Sitzungstokens etwas zu erschweren.
Wenn also das Sitzungstoken gestohlen wurde und eine Anfrage von einer anderen Person gesendet wird, wird die Sitzung bei der nächsten Anfrage des ursprünglichen Benutzers zerstört. Wenn der Benutzer also aktiv auf der Website surft und häufig auf Links klickt, kommt der Dieb mit dem gestohlenen Token nicht weit. Dieses Schema kann verstärkt werden, indem eine andere Authentifizierung für die vertraulichen Vorgänge erforderlich ist (z. B. Löschen eines Kontos).
BEARBEITEN: Bitte beachten Sie, dass dies MITM-Angriffe nicht verhindert, wenn der Angreifer eine eigene Seite mit einem anderen öffentlichen Schlüssel und Proxy-Anforderungen an den Server erstellt. Um sich davor zu schützen, muss der öffentliche Schlüssel im lokalen Speicher des Browsers oder in der App fixiert sein, um diese Art von Tricks zu erkennen.
Über die Implementierung: RSA ist wahrscheinlich der bekannteste Algorithmus, aber für lange Schlüssel ist es ziemlich langsam. Ich weiß nicht, wie schnell eine PHP- oder Javascript-Implementierung sein würde. Aber wahrscheinlich gibt es schnellere Algorithmen.
quelle
Ich würde ein serverseitiges und clientseitiges Diffie-Hellman-Schlüsselaustauschsystem mit AJAX oder mehreren Formularübermittlungen verwenden (ich empfehle das erstere), obwohl ich im Internet keine guten Implementierungen davon sehe. Denken Sie daran, dass eine JS-Bibliothek von MITM immer beschädigt oder geändert werden kann. Lokaler Speicher kann verwendet werden, um dies in gewissem Umfang zu bekämpfen.
quelle
Sie können SRP verwenden , um sichere Kennwörter über einen unsicheren Kanal zu verwenden. Der Vorteil ist, dass ein Angreifer die Kennwörter nicht auf einem anderen Server verwenden kann, selbst wenn er den Datenverkehr abhört oder den Server gefährdet. https://github.com/alax/jsrp ist eine Javascript-Bibliothek, die sichere Kennwörter über HTTP im Browser oder auf der Serverseite (über Knoten) unterstützt.
quelle
HTTPS ist so leistungsfähig, weil es asymmetrische Kryptographie verwendet. Mit dieser Art der Kryptografie können Sie nicht nur einen verschlüsselten Tunnel erstellen, sondern auch überprüfen, ob Sie mit der richtigen Person und nicht mit einem Hacker sprechen.
Hier ist Java-Quellcode, der die asymmetrische Verschlüsselung RSA (von PGP verwendet) zur Kommunikation verwendet: http://www.hushmail.com/services/downloads/
quelle
Sie können SSL für Ihren Host verwenden. Es gibt ein kostenloses Projekt für SSL wie letsencrypt https://letsencrypt.org/
quelle
Die Verwendung von https klingt hier am besten (Zertifikate sind heutzutage nicht mehr so teuer). Wenn jedoch http erforderlich ist, können Sie eine Beschriftung verwenden - schreiben Sie sie auf der Serverseite und beschreiben Sie sie im Browser des Benutzers (Schlüssel separat senden).
Wir haben dies bei der Implementierung von safevia.net verwendet. Die Anmeldung erfolgt auf Clientseite (Sender / Empfänger), sodass Benutzerdaten weder auf Netzwerk- noch auf Serverebene verfügbar sind.
quelle