Wenn ich ein Anmeldesystem einrichten möchte, vergleiche ich immer das MD5 des angegebenen Kennworts mit seinem Wert in der Benutzertabelle auf der Serverseite.
Ein Freund von mir sagte mir jedoch, dass ein "klares" Passwort von einer Netzwerksoftware abgehört werden könnte.
Meine Frage lautet also: Ist es eine gute Idee, das Passwort auf der Clientseite zu hashen? Ist es besser als es auf der Serverseite zu hashen?
passwords
client-side
hash
Zakaria
quelle
quelle
Antworten:
Grundsätzlich hat dein Freund recht. Aber einfach auf der Client - Seite die Passwort - Hashing ist nur gerade besser , als es als Klartext an den Server. Jemand, der auf Ihre Nur-Text-Passwörter warten kann, kann sicherlich auch auf Hash-Passwörter warten und diese erfassten Hashes selbst verwenden, um sich bei Ihrem Server zu authentifizieren.
In diesem Fall springen sicherere Authentifizierungsprotokolle normalerweise durch eine Reihe von Rahmen, um sicherzustellen, dass ein solcher Wiederholungsangriff normalerweise nicht funktioniert, indem der Client eine Reihe von zufälligen Bits auswählen kann, die zusammen mit dem Kennwort gehasht werden und auch im Klartext an den Server übermittelt.
Auf dem Server:
Auf dem Client:
Da der Server seine eigenen zufälligen Informationen sowie die zufälligen Bits des Clients kennt (er hat sie als Klartext erhalten), kann er im Wesentlichen dieselbe Transformation durchführen. Dieses Protokoll stellt sicher, dass niemand, der in diesem Gespräch zuhört, die Informationen später verwenden kann, um sich anhand der aufgezeichneten Informationen fälschlicherweise zu authentifizieren (es sei denn, ein sehr schwacher Algorithmus wurde verwendet ...), solange beide Parteien jedes Mal unterschiedliche "Rauschbits" erzeugen. Der Handschlag wird durchgeführt.
Bearbeiten All dies ist fehleranfällig und langwierig und etwas schwer zu korrigieren (sprich: sicher). Wenn möglich, sollten Sie Authentifizierungsprotokollimplementierungen verwenden, die bereits von sachkundigen Personen geschrieben wurden (im Gegensatz zu mir! Das Obige stammt nur aus der Erinnerung an ein Buch, das ich vor einiger Zeit gelesen habe). Sie möchten dies normalerweise nicht selbst schreiben.
quelle
Erstens verbessert dies NICHT die Sicherheit Ihrer Anwendung (vorausgesetzt, es handelt sich um eine Webanwendung).
Verwenden Sie SSL (oder tatsächlich TLS, das allgemein als SSL bezeichnet wird), es ist nicht wirklich teuer (Messen Sie die Zeit, die Sie verwenden, um Wege zu finden, und multiplizieren Sie es mit dem Mindestlohn, der Kauf eines Zertifikats gewinnt fast immer).
Das Warum dazu ist einfach. TLS löst ein Problem (bei Verwendung mit gekauften Zertifikaten, nicht selbstsigniert), das in der Kryptografie ziemlich groß ist: Woher weiß ich, dass der Server, mit dem ich spreche, der Server ist, mit dem ich zu sprechen glaube? TLS-Zertifikate sind eine Art zu sagen: "Ich, die von Ihrem Browser vertrauenswürdige Zertifizierungsstelle, bescheinige, dass die Website unter [url] diesen öffentlichen Schlüssel mit einem entsprechenden privaten Schlüssel hat, den (privater Schlüssel) nur dem Server bekannt ist Ich habe meine Unterschrift im gesamten Dokument unterschrieben. Wenn jemand sie geändert hat, können Sie sehen ".
Ohne TLS wird jede Verschlüsselung sinnlos, denn wenn ich in einem Coffeeshop neben Ihnen sitze, kann ich Ihren Laptop / Ihr Smartphone glauben lassen, ich sei der Server und MiTM (Man in The Middle) Sie. Mit TLS schreit Ihr Laptop / Smartphone "UNTRUSTED CONNECTION", weil ich kein von der Zertifizierungsstelle signiertes Zertifikat habe, das Ihrer Site entspricht. (Verschlüsselung vs. Authentifizierung).
Haftungsausschluss: Benutzer klicken in der Regel direkt durch diese Warnungen: "Nicht vertrauenswürdige Verbindung? Was? Ich möchte nur meine Bilder von Kätzchen! Ausnahme hinzufügen Klicken Sie auf Bestätigen Klicken Sie auf YAY! Kätzchen!"
Wenn Sie jedoch wirklich kein Zertifikat kaufen möchten, implementieren Sie dennoch clientseitiges Javascript-Hashing (und verwenden Sie dazu die Standford-Bibliothek (SJCL). Implementieren Sie CRYPTO NIEMALS selbst ).
Warum? Passwort wiederverwenden! Ich kann Ihr Sitzungscookie (mit dem ich Ihrem Server vorgeben kann, dass ich Sie bin) ohne HTTPS einfach stehlen (siehe Feuerschaf). Wenn Sie jedoch Ihrer Anmeldeseite ein Javascript hinzufügen, das vor dem Senden Ihr Passwort hasht (verwenden Sie SHA256 oder noch besser SHA256, senden Sie ihnen einen von Ihnen generierten öffentlichen Schlüssel und verschlüsseln Sie dann das Passwort damit, können Sie kein Salt verwenden mit diesem) und sendet dann das gehashte / verschlüsselte Passwort an den Server. REHASHEN Sie den Hash auf Ihrem Server mit einem Salt und vergleichen Sie ihn mit dem, was in Ihrer Datenbank gespeichert ist (speichern Sie das Passwort wie folgt :
(Speichern Sie das Salz auch als Klartext in der Datenbank)). Und senden Sie Ihr Passwort wie folgt:
und überprüfen Sie Ihr Passwort wie folgt:
Denn WENN jemand Ihren Kunden Schnüffeln, werden sie auf Login als Client (Session Hijacking) fähig sein , aber sie werden nie das Klartext - Passwort sehen (es sei denn , sie Ihr Javascript ändern, aber Starbucks ein Hacker wird wahrscheinlich nicht wissen Howto / interessieren in diesem.) So erhalten sie Zugriff auf Ihre Webanwendung, aber nicht auf ihre E-Mail / Facebook / etc. (für die Ihre Benutzer wahrscheinlich dasselbe Passwort verwenden). (Die E-Mail-Adresse ist entweder ihr Loginname oder befindet sich in ihrem Profil / ihren Einstellungen auf Ihrer Webanwendung.)
quelle
Sie können sich wahrscheinlich keine Sorgen machen - wie Dirk erwähnt, selbst wenn Sie die Passwörter hashen, könnte sich ein böswilliger Benutzer in einem Netzwerk befinden und sehen, dass der Hash gesendet wird, und könnte einfach denselben Hash selbst senden.
Es ist insofern etwas besser, als es den böswilligen Benutzer daran hindert, das Kennwort zu kennen. Da er sich jedoch weiterhin anmelden (oder möglicherweise das ursprüngliche Kennwort rekonstruieren ) kann, ist dies nicht hilfreich.
Wenn Sie sich Sorgen über die Sicherheit der Kennwörter und Daten Ihres Benutzers machen (und das sollten Sie auch!), Sollten Sie im Allgemeinen einen sicheren SSL-Server verwenden. Wenn dies aus irgendeinem Grund kein Problem für Sie ist, können Sie sich genauso gut nicht um Hashing kümmern. Es ist nur Sicherheit durch Dunkelheit .
Edit Aug 2014: Google drängt immer stärker darauf, dass Websites überall auf HTTPS umsteigen , da die Sicherung der Kommunikation selbst die einzige Möglichkeit ist, Netzwerk-Sniffing-Angriffe zu verhindern. Versuche, die übertragenen Daten zu verschleiern, behindern einen dedizierten Angreifer nur, halten ihn nicht auf und können Entwicklern ein gefährliches falsches Sicherheitsgefühl vermitteln.
quelle
x
das Kennwort des Benutzers zu erhalten und auf einen einzelnen Dienst zuzugreifen. Wenn Sie den kollektiven Effekt betrachten, würde ich sagen, dass er "viel besser" ist; weil es verhindert, dass große Suchdatenbanken mit Kennwörtern erstellt werden, mit denen gesalzene Hashes über mehrere Dienste hinweg brutal erzwungen werden. IMO. Sehen Sie als Referenz, was AWS Cognito im Client tut.Eigentlich bin ich nicht der Meinung, dass clientseitiges Hashing in diesem Fall sicherer ist. Ich denke, es ist weniger sicher.
Der gesamte Sinn des Speicherns eines Hashs des Passworts in Ihrer Datenbank im Gegensatz zum realen Passwort (oder sogar einem verschlüsselten Passwort) besteht darin, dass es mathematisch unmöglich ist, das ursprüngliche Passwort aus einem Hash zu erhalten (obwohl es theoretisch möglich ist, eine Kollision zu erhalten Hash-Eingabe, deren Schwierigkeit von der Sicherheitsstärke des Hashing-Algorithmus abhängt. Der mögliche Angriffsvektor hier ist, dass ein potenzieller Angreifer, der Ihre Kennwortspeicherdatenbank irgendwie kompromittiert hat, immer noch nicht in der Lage ist, die ursprünglichen Kennwörter Ihrer Benutzer zu erhalten.
Wenn Ihr Authentifizierungsmechanismus einen Hash des Passworts sendet, muss der Angreifer in diesem Sicherheitsverletzungsszenario das echte Passwort nicht kennen. Er sendet nur den Hash, den er hat, und hey presto, er hat Zugriff auf das Konto eines bestimmten Benutzers. und damit Ihr gesamtes System. Damit ist der Punkt, an dem ein Hash-Passwort gespeichert wird, völlig zunichte gemacht!
Der wirklich sichere Weg, dies zu tun, besteht darin, dem Client einen einmaligen öffentlichen Schlüssel zu senden, damit er das Kennwort verschlüsselt. Anschließend entschlüsseln Sie es und hashen es erneut auf der Serverseite.
Übrigens wird diese Art von Frage wahrscheinlich mehr Expertenantworten auf Security StackExchange erhalten.
quelle
Beachten Sie, dass die Sicherheit von Passwörtern gegenüber Dritten nicht alles ist, was dazu gehört.
Sobald Privatsphäre beteiligt ist (und wenn überhaupt ist es nicht, in diesen Tagen?) Sie wollen nicht , um das Passwort kennen. Sie können nicht missbrauchen oder auslaufen, was Sie nicht haben , sodass Sie und Ihre Kunden besser schlafen können, wenn Sie ihre Klartext-Passwörter nie sehen.
Daher ist das Hashing / Verschlüsseln clientseitig sinnvoll.
quelle
x
Benutzer vonn
Diensten, die nur auf dem Server verschlüsseln. Wenn jeder Dienst das Kennwort eindeutig hascht, bevor er den Client verlässt, wird die große Datenbank dienstübergreifender Kennwörter sehr viel kleiner. Überprüfen Sie Ihren AWS-Anmeldeverkehr und sehen Sie, was er tut. Es ist wahrscheinlich, mein lieber Watson.Es hängt davon ab, ob Sie clientseitiges Hashing verwenden können, aber serverseitiges Salt ist nicht möglich.
Schauen Sie sich den Link Passwortverschlüsselung auf der Clientseite an
quelle
Ich habe in letzter Zeit viel daran gearbeitet, IRL, es gibt zwei Probleme mit der clientseitigen Hash- / symmetrischen Verschlüsselung, die die Idee wirklich zunichte machen: 1. Sie müssen das Salz irgendwie auf den Server zurückbringen ... und verschlüsseln Auf der Clientseite benötigen Sie ein Passwort, das den Zweck zunichte macht. 2. Sie legen Ihre Hashing-Implementierung offen (kein RIESIGES Geschäft, da die meisten Websites eines von 3 oder 4 Hashing-Algen verwenden), was den Angriff erleichtert (da Sie nur eines anstelle von n versuchen müssen).
Schließlich ging ich zu einer asymmetrischen Verschlüsselung auf dem Client mit OpenPGP.js oder ähnlichem. Dies basiert auf einem importierten oder clientseitig generierten Schlüssel auf dem Client und dem Server, der seinen öffentlichen Schlüssel sendet. Es darf nur der öffentliche Schlüssel des Clients an den Server zurückgesendet werden. Dies schützt vor MIM-Angriffen und ist so sicher wie das Gerät (ich speichere derzeit den privaten Schlüssel des Clients standardmäßig in localStore, es ist eine Demo).
Der Hauptvorteil davon ist, dass ich niemals Benutzerdaten auf meinem Server / Datenspeicher unverschlüsselt im Speicher speichern muss (und der private Schlüssel meines Servers physisch getrennt ist).
Die Grundlage dafür war, den Menschen eine Möglichkeit zu bieten, sicher zu kommunizieren, wo HTTPS eingeschränkt war (z. B. Iran / Nordkorea atc ...), und auch nur ein lustiges Experiment.
Ich bin weit davon entfernt, daran zu denken, http://www.mailvelope.com/ verwendet dies
quelle
Wenn jemand die Daten in Ihrer Verbindung sehen kann, werden Sie durch die Authentifizierung nicht gerettet. Stattdessen würde ich Folgendes für super geheime Sachen tun.
Auf der Clientseite vorgewaschene Kennwörter, bevor sie an den Server gesendet werden. (Der Server speichert einen anderen Hash- und Salted-Wert dieses vom Browser gesendeten Hashs.)
Ein Middle-Man-Angriff könnte es ihnen also ermöglichen, denselben Hash-Wert zum Anmelden wie sie zu senden, aber das Benutzerpasswort wäre nicht bekannt. Dies würde sie davon abhalten, andere Dienste mit denselben Anmeldeinformationen zu versuchen, sich an anderer Stelle anzumelden.
Benutzerdaten werden auch auf der Browserseite verschlüsselt.
Ah, also würde ein Middle-Man-Angriff die verschlüsselten Daten erhalten, aber ohne das tatsächliche Passwort für die Anmeldung nicht entschlüsseln können. (Benutzerkennwort, das beim Anmelden im DOM des Browsers gespeichert wurde). Der echte Benutzer würde also den entschlüsselten Inhalt sehen, der mittlere Mann jedoch nicht. Dies bedeutet auch, dass eine NSA oder eine andere Agentur Sie / Firma / Hosting-Anbieter nicht auffordern kann, diese Daten zu entschlüsseln, da dies auch für sie unmöglich wäre.
Einige kleine Beispiele für diese beiden Methoden finden Sie in meinem Blog http://glynrob.com/javascript/client-side-hashing-and-encryption/
quelle
Kürzlich gaben sowohl GitHub als auch Twitter bekannt, dass Passwörter in internen Protokollen gespeichert wurden. Ich habe dies versehentlich in Fehlerberichten und anderen Protokollen erlebt, die ihren Weg in Splunk usw. gefunden haben. Für Twitter könnte es eine große Sache für einen Administrator sein, "zu sehen", wenn Trumps Passwort in diesem Protokoll enthalten ist, für andere Websites wahrscheinlich nicht so Eine große Sache, da die Administratoren nicht viel dafür brauchen würden. Unabhängig davon, wie Administratoren wir es nicht mögen, die Passwörter zu sehen, oder?
Die Frage ist also wirklich, ob das Hashing aus Sicherheitsgründen clientseitig erfolgen sollte, aber wie können wir das Kennwort schützen, bevor es letztendlich gehasht und von der Serverseite verglichen wird, damit es nicht irgendwie protokolliert wird.
Verschlüsselung ist keine schlechte Idee, da die Entwickler zumindest durch einige Rahmen springen müssen. Wenn Sie feststellen, dass Kennwörter in Protokollen enthalten sind, können Sie einfach den Verschlüsselungsschlüssel ändern, das Original zerstören und die Daten werden unbrauchbar. Besser noch die Tasten jede Nacht drehen und es könnte die Fenster stark reduzieren.
Sie können auch einen Hash in Ihrem Benutzerdatensatz hashen. Die durchgesickerten Passwörter wären reine Hash-Passwörter. Der Server würde eine Hash-Version des Hash speichern. Sicher, der Hash wird zum Passwort, aber wenn Sie kein fotografisches Gedächtnis haben, werden Sie sich nicht an ein 60-Zeichen-Bcyrpt erinnern. Salz mit dem Benutzernamen. Wenn Sie während des Anmeldevorgangs etwas über den Benutzer erfahren könnten (ohne zu offenbaren, dass der Benutzerdatensatz vorhanden ist), können Sie damit auch einen robusteren Hash erstellen, der nicht zwischen Websites geteilt werden kann. Kein Mann in der Mitte wäre in der Lage, den erfassten Hash einfach zwischen Websites auszuschneiden und einzufügen.
Kombinieren Sie es mit einem Cookie, das nicht an den Server zurückgesendet wird, und Sie befinden sich möglicherweise auf etwas. Senden Sie auf erste Anfrage ein Cookie mit einem Schlüssel an den Client, und stellen Sie dann sicher, dass das Cookie nicht zum Anmeldedienst zurückkehrt, sodass die Wahrscheinlichkeit gering ist, dass es protokolliert wird. Speichern Sie den Schlüssel in einem Sitzungsspeicher und löschen Sie ihn dann direkt nach der Anmeldung oder nach Ablauf der Sitzung. Dies erfordert einen Status für Sie JWT-Leute, aber verwenden Sie möglicherweise nur einen nosql-Dienst dafür.
Ein Administrator stößt also später auf eines dieser gehashten und verschlüsselten Passwörter in Splunk oder einem Tool zur Fehlerberichterstattung. Es sollte für sie nutzlos sein, da sie den Verschlüsselungsschlüssel nicht mehr finden können, und selbst wenn sie dies tun, müssen sie einen Hash brutal erzwingen. Außerdem hat der Endbenutzer keinen Klartext entlang der Linie gesendet, sodass es jedem Mann in der Mitte zumindest schwerer fällt und Sie nicht einfach zu einer anderen Site springen und sich anmelden können.
quelle
Bedenken Sie:-
Der Client sendet eine Anfrage an den Server "Ich habe ein Passwort zur Validierung".
Der Server sendet dem Client eine einmalige zufällige Zeichenfolge. R $
Der Client bettet das Kennwort des Benutzers in diese Zeichenfolge ein (basierend auf allen (variablen) Regeln, die Sie anwenden möchten).
Der Client sendet die Zeichenfolge an den Server. Wenn das Kennwort OK ist, meldet sich der Server beim Benutzer an.
Sollte der Server eine weitere Anmeldeanforderung mit R $ erhalten, wird der Benutzer abgemeldet und das Konto wird bis zur Untersuchung eingefroren.
Offensichtlich würden alle anderen (normalen) Sicherheitsvorkehrungen getroffen.
quelle
Diese Idee des clientseitigen Hashings dient dem Schutz des Benutzers und nicht Ihrer Website. Wie bereits mehrfach erwähnt, haben sowohl Klartext- als auch Hash-Passwörter gleichermaßen Zugriff auf Ihre Website. Sie erhalten keinen Sicherheitsvorteil.
Das tatsächliche Klartext-Passwort Ihrer Benutzer sollte jedoch nur ihnen bekannt sein. Zu wissen, was sie als Passwort gewählt haben, sind Informationen, die auf anderen Websites und Systemen gegen sie verwendet werden können. Sie sind eine kundenorientierte Site, indem Sie sie davor schützen, dass ihre Serverauswahl von Ihren Serverentwicklern oder von Dritten entdeckt wird.
quelle