it-swarm.com.de

Wie sende ich ein Passwort sicher über HTTP mit Javascript ohne HTTPS?

Das grundlegende Problem, mit dem alle Entwickler konfrontiert sind: Jedes Mal, wenn Benutzer das Formular einreichen, wird das Kennwort über das Netzwerk gesendet und muss geschützt werden. Die Site, für die ich entwickle, hat kein HTTPS. Der Eigentümer möchte weder ein SSL-Zertifikat kaufen, noch ist er an einem selbstsignierten interessiert. Deshalb möchte ich das über HTTP gesendete Passwort beim Absenden des Formulars mit Javascript schützen.

Zu den eifrigen Abwählern: Wie man Kennwort sicher über HTTP sendet? Gibt KEINE vernünftige Lösung und ich bin in einer anderen Situation.

Wenn ich MD5 verwende, kann man diesen Passwortstring umkehren. Was ist mit nonce/HMAC? Gibt es dafür eine verfügbare Javascript-Bibliothek? Oder haben Sie Anregungen/Hinweise? Danke im Voraus!

55
Viet

Es gibt keine Möglichkeit, ein Passwort sicher zu senden das der Benutzer überprüfen kann ohne SSL.

Natürlich können Sie JavaScript schreiben, um ein Passwort für die drahtlose Übertragung durch Hashing oder Verschlüsselung mit öffentlichen Schlüsseln zu schützen. Aber wie kann der Benutzer sicher sein, dass das JavaScript selbst nicht von einem Mann in der Mitte manipuliert wurde, bevor es diese erreicht hat, um das Kennwort an einen Angreifer anstelle der Website zu senden oder sogar nur die Sicherheit der Website zu gefährden? Algorithmus? Die einzige Möglichkeit wäre, dass sie erfahrene Programmierer sind und jede Zeile Ihrer Seite und Ihres Skripts überprüfen, um sicherzustellen, dass sie koscher sind, bevor Sie das Kennwort eingeben. Das ist kein realistisches Szenario.

Wenn Sie möchten, dass Kennwörter vor Man-in-the-Middle-Angriffen geschützt sind, müssen Sie ein SSL-Zertifikat erwerben. Es geht nicht anders. An etwas gewöhnen.

Wenn ich MD5 verwende, kann man diesen Passwortstring umkehren.

Nein ... zumindest nicht trivial. Während MD5 Angriffe hat, ist es ein Hashing-Algorithmus und daher nicht rückgängig zu machen. Sie müssten es brachial erzwingen.

Aber auch hier muss ein Man-in-the-Middle-Angreifer nicht auf Ihre MD5s schauen. Er kann einfach das JavaScript sabotieren, das Sie dem Benutzer senden, um die MD5s zu erstellen.

77
bobince

Die Lösung besteht darin, das Passwort überhaupt nicht zu senden. Verwenden Sie Herausforderung/Antwort.

Fügen Sie im Originalformular einen großen zufälligen Textblock zusammen mit einem Schlüssel hinzu. Speichern Sie den ursprünglichen zufälligen Text in der Sitzung basierend auf dem Schlüssel auf dem Server. Wenn der Client das Formular absendet, verwenden Sie JS, um den zufälligen Text und das Kennwort zusammen zu hashen. Senden Sie dann den Benutzernamen, den Schlüssel und den zufälligen Hashtext an den Server. Senden Sie das Passwort NICHT. Verwenden Sie auf dem Server die Taste, um den ursprünglichen zufälligen Text zu suchen, und führen Sie denselben Hashing-Vorgang mit dem gespeicherten Kennwort aus. Wenn der vom Server gehashte Wert mit dem vom Client gehashten Wert übereinstimmt, wissen Sie, dass der Client das richtige Kennwort eingegeben hat, ohne das Kennwort jemals an den Server zu senden.

Unabhängig davon, ob das Kennwort richtig ist oder nicht, verfallen der Schlüssel und der zufällige Text, sodass sie jeweils nur einmal verwendet werden können.

24
Samuel Neff

Wenn Sie WIRKLICH darauf eingehen möchten, schauen Sie sich den Diffie-Hellman-Schlüsselaustausch an, der erstellt wurde, um "zwei Parteien, die keine Vorkenntnisse haben, die Möglichkeit zu geben, gemeinsam einen gemeinsamen geheimen Schlüssel zu erstellen ein unsicherer Kommunikationskanal "

Ich bin allerdings kein Kryptografie-Experte, daher weiß ich nicht genau, ob es wirklich sicher ist, wenn ein Angreifer sowohl den Client (JavaScript-Quellcode) als auch den Transportmechanismus (Packet Sniffer) hat.

11
Michael Stum

Sie können eine JavaScript-RSA-Implementierung verwenden, um das Kennwort vor dem Senden zu verschlüsseln. (Hier ist ein Beispiel für RSA In Javascript .)

Aber ich glaube, dass sowohl diese als auch die Verwendung einer Hash-Funktion anfällig für Wiederholungsangriffe sind. Also sei vorsichtig.

5
Szere Dyeri

Leider kann die Sicherheit einer unverschlüsselten Anfrage nicht gewährleistet werden. Jeder, der Zugriff auf Ihr Javascript hat, kann es einfach zurückentwickeln/manipulieren, und jeder, der einen Paket-Sniffer hat, kann den unverschlüsselten Datenverkehr verfolgen. Diese beiden Fakten zusammen bedeuten:

Kein SSL? Keine Sicherheit.

4
rfunduk

Wenn Sie keinen Zugriff auf SSL haben, sollte MD5 ausreichen, um das versehentliche Erkennen von Kennwörtern (z. B. in einer Netzwerkprotokolldatei oder Ähnlichem) zu verhindern. Alles andere wäre Zeitverschwendung. Stellen Sie einfach sicher, dass die App keinen Zugriff auf vertrauliche Informationen (z. B. Kreditkartennummern, Krankengeschichte usw.) gewährt.

Wie andere Kommentatoren vorgeschlagen haben, kann ein schwerer Angreifer jede Art von Sicherheit auf der Seite verletzen. Sogar SSL ist eine kleine Barriere, da die meisten Benutzer leicht zu erratende Kennwörter verwenden, überall dieselben Kennwörter wiederverwenden, ihr Kennwort an jeden weitergeben, der danach fragt, oder dazu verleitet werden können, ihr Kennwort durch eine kopierte Seite oder "Technik" preiszugeben Unterstützung "Anruf.

1
Brian

Jede Übertragung, die Sie haben, wird im Klaren sein; Das heißt, ohne SSL werden Ihre kritischen Informationen offengelegt. Es lohnt sich, diesen Punkt mit dem Eigentümer der Website zu besprechen. Mit anderen Worten, es ist am besten, die notwendigen Maßnahmen zu ergreifen, um Ihre Datenübertragung zu verstärken, und SSL ist einer der grundlegenden, kostengünstigen Schritte, die Sie unternehmen können.

1
David Robbins

ich denke nicht, dass das Problem hier die Technologie ist, sondern wie Sie die Bedeutung von SSL erklären. Stellen Sie ihnen zuverlässige Lesematerialien zur Verfügung. Ich bin mir sicher, dass es über das Internet eine Menge davon gibt.

1

Die Lösung setzt voraus, dass der Client das Kennwort mit einem geheimen Verschlüsselungsschlüssel verschlüsseln kann, der nur dem Client nd dem Server bekannt ist.

SSL setzt voraus, dass sowohl der Server als auch der Client-Webbrowser über ein eigenes asymmetrisches öffentliches/privates Schlüsselpaar verfügen, mit dem sie einen zufälligen Sitzungsschlüssel verschlüsseln und zwischen sich übertragen. Der Rest der Konversation verwendet dann diesen sicheren Sitzungsschlüssel.

Sie fragen sich also, wie Sie dasselbe Problem wie bei SSL lösen können, ohne einen geheimen Schlüssel zu haben, der dem Client und dem Server bekannt ist nur. Ich bin kein Experte, aber es sieht so aus, als ob dies nicht oder nur schwer möglich ist.

1
David R Tribble

Wie bereits erwähnt, ist nichts davon gegen Server Spoofing sicher, da dies die Fähigkeit erfordert, dem clientseitigen Javascript zu vertrauen. Aber wenn wir sicher sind, dass der Server nicht gefälscht werden kann (signiertes Zertifikat, Hash-Signatur, immun gegen Längenerweiterung usw.), aber nicht dass die Verbindung immun gegen Lauschangriffe ist, hier ist, wie ich ' d implementieren.

Ich denke, der sicherste Weg ist, anstatt H (password) zu speichern, wobei H die Hash-Funktion Ihrer Wahl ist, speichern Sie g ^ H (passwort) d. h. das Passwort als privaten Schlüssel für den Diffie-Hellman-Schlüsselaustausch verwenden. (Sie sollten wahrscheinlich auch ein zufälliges g für verschiedene Benutzer verwenden - es wird zu Ihrem Salt.) Zur Überprüfung generieren Sie dann ein Nonce b, senden den Benutzer g ^ b und berechnen (g ^ H (passwort)) ^ b. Der Benutzer muss g nicht kennen - er muss nur (g ^ b) ^ H (Passwort) = (g ^ H (Passwort)) ^ b berechnen. Nun haben Sie eine Nummer, die beiden Parteien bekannt ist iff der Benutzer hat das richtige Passwort eingegeben, und es wird ein wissensfreier Challenge-Response-Beweis auf der Grundlage der Kenntnis der richtigen Nummer erstellt, während die Zufallszahl als Grundlage dient Der "private Schlüssel" des Servers macht den Ansatz immun gegen Wiederholungsangriffe.

0
NXTangl

Ich denke an etwas, aber ich weiß nicht, ob es wirklich sicher sein könnte. Wenn Sie Ihr Formular in eine PHP-Datei einfügen können, können Sie einen Algorithmus zum Erstellen einer Zeichenfolge basierend auf der Zeit oder in etwas anderem erstellen und diese Zeichenfolge dann in Ihren HTML-Code einfügen.

Wenn der Benutzer ein Kennwort in ein Kennworteingabefeld eingibt und Sie es debuggen, können Sie den vom Benutzer eingegebenen Wert nicht sehen. Bevor Sie also die Informationen per Post senden oder abrufen, können Sie den Kennwortbenutzer als Hinweis verwenden, um die zuvor verschlüsselte Zeichenfolge zu verschlüsseln generiert und dann gesendet, nur instaliert von dem vom Benutzer eingegebenen Passwort.

Auf diese Weise haben die Angreifer nicht alles im js-Code, sodass sie den von Ihnen erstellten Algorithmus zum Entschlüsseln ermitteln müssen.

Dies ist nur eine Idee. Wenn Sie mir also sagen können, wie sicher dies nicht sein kann, würde ich es begrüßen.

- Spanisch - Se me acaba de ocurrir algo que puede servir, pero no se si realmente sea algo seguro. Für die Erstellung einer Liste mit dem Basis-Zeitstempel müssen Sie den Colocar-Code und den HTML-Code eingeben.

Beachten Sie, dass die Eingabe des Kennworts und die Eingabe des Kennworts kontraproduktiv sind, und dass das Debuggen nicht für den Wert des Benutzers durchgeführt werden kann (es ist keine Manera vorhanden, die keine Überprüfung erfordert) como palabra clave para encriptar la cadena de texto que previamente habiamos generado con php, por medio de un algoritmo en JS. Sería algo así como encriptar lo encriptado. Posteriormente lo que estariamos enviado no sería la contraseña tecleada, si no esta última cadena resultante.

Sie können sich jederzeit an uns wenden, wenn Sie Fragen zu diesem Thema haben, oder wenn Sie möchten, dass Sie das endgültige Ergebnis erhalten el algoritmo.

Es ist eine Idee für sich, sie ist für sich allein und hat keine ser seguro, se los agradecería.

0
eduardossmx