Wie versende ich ein Passwort sicher via HTTP mit Javascript in Abwesenheit von HTTPS?
Den sehr grundlegenden Problem aller Entwickler zu tun: Wenn der Benutzer das Formular sendet, wird das Kennwort geschickt wird, über das Netzwerk, und es muss geschützt werden. Die Seite, die ich entwickeln ist nicht über HTTPS. Weder die Besitzer möchten, kaufen Sie ein SSL-Zertifikat, noch ist er daran interessiert, ein selbst signiertes. So möchte ich zum Schutz des Passwortes per HTTP über Javascript beim Absenden.
Eifrig downvoters: So senden Sie ein Passwort sicher über HTTP? gibt KEINE vernünftige Lösung, und ich bin in einer anderen situation.
Wenn ich mit MD5 kann man umkehren, dass ein Passwort-string. Was nonce/HMAC? Alle verfügbaren Javascript-Bibliothek? Oder haben Sie eine Anregung/Tipp zur Bekämpfung? Vielen Dank im Voraus!
InformationsquelleAutor der Frage Viet | 2010-01-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es keine Möglichkeit, ein Kennwort senden, sicher dass der Benutzer überprüfen kann, ohne SSL.
Sicher, Sie können einige JavaScript schreiben, um das Passwort sicher für über-den-Draht-übertragung durch hashing oder public-key-Verschlüsselung. Aber wie kann der Benutzer sicher sein, dass das JavaScript selbst nicht manipuliert wurde durch einen man-in-the-middle-bevor es Sie erreicht, das Kennwort zu senden, um einem Angreifer statt von der Seite, oder auch nur gefährden die Sicherheit des Algorithmus? Der einzige Weg wäre, diese zu Programmieren und haben Sie untersuchen Sie jede Zeile Ihrer Seite und Skript, um sicherzustellen, es war koscher, bevor Sie das entsprechende Kennwort eingeben. Das ist kein realistisches Szenario.
Wenn Sie möchten, dass Passwörter sicher vor man-in-the-middle-Angriffe, müssen Sie kaufen eine SSL-cert. Es gibt keinen anderen Weg. Holen Sie verwendet, um es.
Nicht... nicht trivial mindestens. Während MD5 hat Angriffe gegen ihn, es ist ein hashing-Algorithmus und damit unreversable. Sie würde haben, um brute-force.
Aber wieder, einen man-in-the-middle-Angreifer nicht brauchen, zu betrachten, Ihre MD5s. Er kann einfach die sabotage der JavaScript-schicken Sie dem Benutzer, um die MD5s.
InformationsquelleAutor der Antwort bobince
Die Lösung hier ist, dass nicht senden Sie das Kennwort an alle. Verwenden Sie ein challenge/response.
In der ursprünglichen form gehört ein großer block von random text zusammen mit einem Schlüssel. Speichern der ursprünglichen zufälligen text in der Sitzung, basierend auf Schlüssel auf dem server. Wenn der client das Formular absendet, verwenden Sie JS hash die zufällige text-und Passwort zusammen. Dann senden Sie die Benutzername, key, Hash einen beliebigen text an den server. NICHT senden Sie das Kennwort. Auf dem server den Schlüssel verwenden, um nachschlagen der ursprünglichen random text, führen Sie die gleichen hashing-Betrieb mit dem gespeicherten Passwort. Wenn der server-Hash-Wert übereinstimmt, der client-Hash-Wert, dann weiß der client das richtige Passwort eingegeben, ohne jemals senden Sie das Kennwort an den server.
Ob das Kennwort richtig ist oder nicht, erlischt die Schlüssel und einen beliebigen text, so dass jede ein-Zeit-verwenden.
InformationsquelleAutor der Antwort Samuel Neff
Wenn Sie WIRKLICH wollen, zu tief Tauchen Sie ein in diese, Blick auf die Diffie-Hellman-key-exchangeder geschaffen wurde, "damit zwei Parteien, die ohne Vorkenntnisse von einander, um gemeinsam einrichten einer gemeinsamen geheimen Schlüssel über einen unsicheren Kommunikationskanal"
Ich bin kein Kryptographie-Experte, obwohl, so dass ich nicht vollständig wissen, ob es wirklich sicher, wenn ein Angreifer sowohl auf dem Client (JavaScript source code") und der transport-Mechanismus (Packet sniffer)
InformationsquelleAutor der Antwort Michael Stum
Verwenden Sie eine javascript-RSA-Implementierung um das Kennwort zu verschlüsseln, bevor Sie Sie versenden. (Hier ist ein Beispiel von RSA In Javascript.)
Aber ich glaube, dass beide diese und eine hash-Funktion wird anfällig für replay-Angriffe. Also, seien Sie vorsichtig.
InformationsquelleAutor der Antwort Szere Dyeri
Leider gibt es keine Möglichkeit der Gewährleistung der Sicherheit von einem nicht-verschlüsselten Anfrage. Jeder mit Zugang zu Ihrem javascript wird einfach in der Lage sein, um reverse Engineering es/ihn manipulieren und jemand mit einem packet-sniffer wird in der Lage sein, zu beobachten, den unverschlüsselten traffic. Diese beiden Fakten zusammen bedeuten:
Kein SSL? Keine Sicherheit.
InformationsquelleAutor der Antwort rfunduk
Jede übertragung, die Sie in das klar; das ist, ohne SSL-Verfahrens werden Ihre kritischen Informationen ausgesetzt sein wird. Es lohnt sich, diskutieren Sie diesen Punkt mit dem Inhaber der Website. In anderen Worten, es ist am besten, um notwendige Maß zu verstärken Sie Ihre Datenübertragung und SSL ist eine grundlegende, Billig Schritte, die Sie ergreifen können.
InformationsquelleAutor der Antwort David Robbins
ich glaube nicht, dass das Problem hier ist die Technik, aber wie erklären Sie die Bedeutung von SSL. Liefern Sie mit zuverlässigen lesestoff, ich bin sicher, es gibt viel über das web.
InformationsquelleAutor der Antwort Martin Ongtangco
Die Lösung erfordert, dass der client in der Lage, um das Kennwort zu verschlüsseln mit einem geheimen Verschlüsselungsschlüssel bekannt nur an den client und dem server.
SSL erreicht dies durch die Auflage, dass sowohl der server und der client-web-browser, um Ihre eigene asymmetrische public/private Schlüsselpaar, das Sie verwenden, um zu verschlüsseln und zu übertragen, einen zufälligen session-key zwischen Ihnen. Der rest des Gesprächs dann verwendet, Sicheres session-key.
Du bist also zu Fragen, wie lösen Sie das gleiche problem wie SSL, ohne den Vorteil, dass Sie einen geheimen Schlüssel, der bekannt ist nur für den client und den server. Ich bin kein Experte, aber es sieht aus wie dieses nicht getan werden kann, oder zumindest nicht so einfach.
InformationsquelleAutor der Antwort David R Tribble
Wenn Sie nicht haben Zugriff auf SSL, MD5 sollte ausreichend sein, um zu verhindern, dass zufällige Entdeckung Kennwörter (wie in einem Netzwerk log-Datei oder sowas). Alles andere wäre eine Verschwendung von Zeit. Nur stellen Sie sicher, dass die app nicht den Zugriff auf vertrauliche Informationen (d.h., Kreditkartennummern, medizinische Geschichte, etc.).
Wie andere Kommentatoren vorgeschlagen haben, eine schwere Angreifer in der Lage sein zu brechen, jede Art von Sicherheit auf der Seite. Auch SSL ist eine kleine Barriere, da die meisten Benutzer verwenden leicht zu erratende Passwörter, wieder verwenden die gleichen Passwörter überall, geben Ihr Passwort an jeden, der das fragt, oder kann ausgetrickst werden, geben Ihr Passwort von einer kopierten Seite oder "tech-support" angerufen.
InformationsquelleAutor der Antwort Brian
-- Deutsch --
ich glaube an etwas, aber ich weiß nicht, ob es sein könnte, wirklich sicher ist. Wenn Sie Ihr Formular in einer php-Datei, dann können Sie eine algoritm für einen string-basiert in der Zeit oder in etwas anderes, und setzen Sie dann diese Zeichenkette in den html-Code.
Wenn der Benutzer geben Sie ein Kennwort in einem Kennwort-Eingabefeld, wenn Sie Debuggen, um Sie nicht sehen den Wert eingegeben durch den Benutzer, so dass vor dem senden der Informationen via get oder post, können Sie die Passwort-Benutzer als Hinweis, der zum verschlüsseln der verschlüsselten Zeichenfolge vorher erzeugt, und dann schickte er statt der eingegebenen Kennwort durch den Benutzer.
In diesem Weg, die Angreifer haben nicht alle in der js-code, so dass Sie müssen entdecken Sie die algoritm, die Sie erstellen, um es zu entschlüsseln.
Dies ist nur eine Idee, also, wenn Sie können mir sagen, wie diese können nicht sicher sein, würde ich mich freuen.
-- Spanisch --
Se me acaba de ocurrir algo que puede servir, pero no se si realmente Meer algo seguro. Por medio de php puedes generar un algoritmo que cree un-string en base al timestamp-o algo más, y después colocar esta cadena en el html.
Hinweis que cuando alguien escribe una contraseña de un campo-Eingang tipo Passwort, con un debug-no se puede ver el valor que tecleo el usuario (no se si exista manera pero no quise investigar más), asi que podemos utilizar la contraseña que el usuario escribió como palabra clave para encriptar la cadena de texto que previamente habiamos generado con php, por medio de un algoritmo de 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.
Buscando un contra, lo único que se me ocurra es que el atacante tendrá que dedicarle mucho tiempo para tratar de encontrar el agoritmo que creamos por medio de php-y poder decriptar la cadena Finale, o tendrá que hackear el servidor para acceder al php-y obtener el algoritmo.
Esto es solo una idea, por lo que si pueden decirme como esto no puede ser seguro, se los agradecería.
InformationsquelleAutor der Antwort eduardossmx
Wie bereits erwähnt, nichts davon ist sicher gegen server spoofing, als dass die Fähigkeit erfordert, um das Vertrauen der client-side Javascript. Aber wenn wir sicher sind, dass der server kann nicht gefälscht werden (signed cert-hash signieren immun Länge-Erweiterung, etc.) aber nicht , die Verbindung ist gegen Abhören, hier ist, wie ich es umsetzen.
Ich denke der sicherste Weg ist, statt die Speicherung von H(Passwort), wobei H für Ihre hash-Funktion von der Wahl, store-g^H(Passwort), d.h. verwenden Sie als Kennwort den privaten Schlüssel für Diffie-Hellman key exchange. (Außerdem sollten Sie wahrscheinlich verwenden Sie eine zufällige g für verschiedene Benutzer-es wird Ihr Salz.) Dann, um zu überprüfen, generieren Sie eine nonce b, senden Sie dem Benutzer g^b, und berechnen Sie (g^H(Passwort))^b ist. Der Benutzer braucht nicht zu wissen, g-Sie brauchen nur compute (g^b)^H(Passwort) = (g^H(Passwort))^b ist. Jetzt haben Sie eine Zahl, die beide Parteien wissen iff der Benutzer das richtige Passwort eingegeben, und der Errichtung einer challenge-response-zero-knowledge-Beweis, basierend auf wissen, die richtige Anzahl trivial ist, während die zufällige Zahl verwendet werden, als server ist "private key" lässt den Ansatz immun gegen replay-Angriffe.
InformationsquelleAutor der Antwort NXTangl