Der endgültige Leitfaden zur formularbasierten Website-Authentifizierung [geschlossen]


5372

Formularbasierte Authentifizierung für Websites

Wir glauben, dass der Stapelüberlauf nicht nur eine Ressource für sehr spezifische technische Fragen sein sollte, sondern auch für allgemeine Richtlinien zur Lösung von Variationen bei häufig auftretenden Problemen. "Formularbasierte Authentifizierung für Websites" sollte ein gutes Thema für ein solches Experiment sein.

Es sollte Themen enthalten wie:

  • So melden Sie sich an
  • So melden Sie sich ab
  • So bleiben Sie angemeldet
  • Cookies verwalten (einschließlich empfohlener Einstellungen)
  • SSL / HTTPS-Verschlüsselung
  • So speichern Sie Passwörter
  • Geheime Fragen verwenden
  • Vergessener Benutzername / Passwort-Funktionalität
  • Verwendung von Nonces zur Verhinderung von Fälschungen von standortübergreifenden Anfragen (CSRF)
  • OpenID
  • Kontrollkästchen "Erinnere dich an mich"
  • Automatische Vervollständigung von Benutzernamen und Passwörtern durch den Browser
  • Geheime URLs (öffentliche URL durch Digest geschützt)
  • Überprüfen der Passwortstärke
  • E-Mail-Validierung
  • und vieles mehr über formularbasierte Authentifizierung ...

Es sollte keine Dinge enthalten wie:

  • Rollen und Autorisierung
  • HTTP-Basisauthentifizierung

Bitte helfen Sie uns durch:

  1. Unterthemen vorschlagen
  2. Gute Artikel zu diesem Thema einreichen
  3. Bearbeiten der offiziellen Antwort

52
Warum die HTTP-Basisauthentifizierung ausschließen? Es kann in HTML-Formularen über Ajax funktionieren
System PAUSE

55
HTTP Basic Auth hat die Eigenschaft, dass es (vergleichsweise) schwierig ist, einen Browser vergessen zu lassen. Es ist auch schrecklich unsicher, wenn Sie es nicht mit SSL verwenden, um die Verbindung zu sichern (dh HTTPS).
Donal Fellows

24
Ich denke, es lohnt sich, über Sitzungscookies (einschließlich Fixierung und Hijacking) zu sprechen (die sicheren und Nur-http-Flags). HTTP-basiertes SSO
Symcbean

29
Das äußerst nützliche HttpOnlyCookie-Flag, das JavaScript-basierten Cookie-Diebstahl (eine Teilmenge von XSS-Angriffen) verhindert, sollte ebenfalls irgendwo erwähnt werden.
Alan H.

80
Beeindruckend. Lange Antworten, Dutzende von Upvotes für einige von ihnen, aber niemand erwähnt den häufigen Fehler, Anmeldeformulare über HTTP bereitzustellen. Ich habe mich sogar mit Leuten gestritten, die sagten "aber es wird an https: // ... gesendet" und nur leere Blicke erhielten, als ich fragte, ob sie sicher waren, dass ein Angreifer die unverschlüsselte Seite, über die das Formular geliefert wurde, nicht neu geschrieben hat .
Dzuelke

Antworten:


3764

TEIL I: So melden Sie sich an

Wir gehen davon aus, dass Sie bereits wissen, wie Sie ein HTML-Formular für Login + Passwort erstellen, das die Werte zur Authentifizierung in ein Skript auf der Serverseite überträgt. In den folgenden Abschnitten werden Muster für eine solide praktische Authentifizierung und die Vermeidung der häufigsten Sicherheitsrisiken behandelt.

Zu HTTPS oder nicht zu HTTPS?

Sofern die Verbindung nicht bereits sicher ist (dh mithilfe von SSL / TLS über HTTPS getunnelt wird), werden Ihre Anmeldeformularwerte im Klartext gesendet, sodass jeder, der die Leitung zwischen Browser und Webserver abhört, die Anmeldungen während des Durchlaufs lesen kann durch. Diese Art des Abhörens wird routinemäßig von Regierungen durchgeführt, aber im Allgemeinen werden wir keine "eigenen" Drähte ansprechen, außer dies zu sagen: Verwenden Sie einfach HTTPS.

Im Wesentlichen besteht der einzige praktische Weg zum Schutz vor Abhören / Paket-Sniffing während der Anmeldung in der Verwendung von HTTPS oder einem anderen zertifikatbasierten Verschlüsselungsschema (z. B. TLS ) oder einem bewährten und getesteten Challenge-Response-Schema (z. B. Diffie-Hellman) -basiertes SRP). Jede andere Methode kann von einem abhörenden Angreifer leicht umgangen werden.

Wenn Sie bereit sind, ein wenig unpraktisch zu werden, können Sie natürlich auch ein Zwei-Faktor-Authentifizierungsschema verwenden (z. B. die Google Authenticator-App, ein physisches Codebuch im Stil des Kalten Krieges oder einen RSA-Schlüsselgenerator-Dongle). Bei korrekter Anwendung könnte dies auch bei einer ungesicherten Verbindung funktionieren, aber es ist schwer vorstellbar, dass ein Entwickler bereit wäre, eine Zwei-Faktor-Authentifizierung zu implementieren, jedoch kein SSL.

(Nicht) Roll-your-own JavaScript-Verschlüsselung / Hashing

Angesichts der wahrgenommenen (wenn auch jetzt vermeidbaren ) Kosten und technischen Schwierigkeiten beim Einrichten eines SSL-Zertifikats auf Ihrer Website sind einige Entwickler versucht, ihre eigenen Hashing- oder Verschlüsselungsschemata im Browser zu verwenden, um zu vermeiden, dass Klartextanmeldungen über eine ungesicherte Leitung übertragen werden.

Obwohl dies ein nobler Gedanke ist, ist er im Wesentlichen nutzlos (und kann eine Sicherheitslücke sein ), es sei denn, er wird mit einer der oben genannten kombiniert - das heißt, entweder die Leitung mit starker Verschlüsselung zu sichern oder eine bewährte Challenge-Response zu verwenden Mechanismus (wenn Sie nicht wissen, was das ist, wissen Sie einfach, dass es eines der am schwierigsten zu beweisenden, am schwierigsten zu entwerfenden und am schwierigsten zu implementierenden Konzepte in der digitalen Sicherheit ist).

Es stimmt zwar, dass die Passwort - Hashing sein kann gegen wirksames Passwort Offenlegung , es ist anfällig Angriffe zu wiederholen, Man-In-The-Middle - Angriffe / Entführungen (wenn ein Angreifer ein paar Bytes in der ungesicherte HTML - Seite injizieren kann , bevor es erreicht Ihre Browser können sie einfach das Hashing im JavaScript auskommentieren) oder Brute-Force-Angriffe (da Sie dem Angreifer sowohl den Benutzernamen als auch das Salt und das Hash-Passwort übergeben).

CAPTCHAS gegen die Menschheit

CAPTCHA soll eine bestimmte Angriffskategorie vereiteln: automatisiertes Wörterbuch / Brute-Force-Versuch und Irrtum ohne menschlichen Bediener. Es besteht kein Zweifel, dass dies eine echte Bedrohung ist. Es gibt jedoch Möglichkeiten, nahtlos damit umzugehen, ohne dass ein CAPTCHA erforderlich ist, das speziell für die serverseitige Anmeldedrosselung entwickelt wurde. Wir werden diese später erörtern.

Wissen Sie, dass CAPTCHA-Implementierungen nicht gleich erstellt werden. Sie sind oft nicht vom Menschen lösbar, die meisten von ihnen sind tatsächlich gegen Bots unwirksam, alle sind gegen billige Arbeitskräfte aus der Dritten Welt unwirksam (laut OWASP beträgt die aktuelle Sweatshop-Rate 12 USD pro 500 Tests), und einige Implementierungen können es sein In einigen Ländern technisch illegal (siehe OWASP Authentication Cheat Sheet ). Wenn Sie ein CAPTCHA verwenden müssen, verwenden Sie das reCAPTCHA von Google , da es per Definition OCR-hart ist (da es bereits OCR-falsch klassifizierte Buchscans verwendet) und sich sehr bemüht, benutzerfreundlich zu sein.

Persönlich finde ich CAPTCHAS eher ärgerlich und verwende sie nur als letzten Ausweg, wenn sich ein Benutzer mehrmals nicht angemeldet hat und die Drosselungsverzögerungen maximal sind. Dies geschieht selten genug, um akzeptabel zu sein, und stärkt das Gesamtsystem.

Speichern von Passwörtern / Überprüfen von Anmeldungen

Dies mag nach all den öffentlich bekannt gewordenen Hacks und Benutzerdatenlecks, die wir in den letzten Jahren gesehen haben, endlich allgemein bekannt sein, aber es muss gesagt werden: Speichern Sie Passwörter nicht im Klartext in Ihrer Datenbank. Benutzerdatenbanken werden routinemäßig durch SQL-Injection gehackt, durchgesickert oder abgerufen. Wenn Sie rohe Klartext-Kennwörter speichern, ist dies für Ihre Anmeldesicherheit ein sofortiges Spielende.

Wenn Sie das Passwort nicht speichern können, wie überprüfen Sie dann, ob die Kombination aus Login und Passwort, die über das Login-Formular veröffentlicht wurde, korrekt ist? Die Antwort ist Hashing mit einer Schlüsselableitungsfunktion . Wenn ein neuer Benutzer erstellt oder ein Kennwort geändert wird, nehmen Sie das Kennwort und führen es über eine KDF wie Argon2, bcrypt, scrypt oder PBKDF2 aus. Dabei wird das Klartext-Kennwort ("korrekthorsebatterystaple") in eine lange, zufällig aussehende Zeichenfolge umgewandelt , was viel sicherer in Ihrer Datenbank zu speichern ist. Um eine Anmeldung zu überprüfen, führen Sie dieselbe Hash-Funktion für das eingegebene Kennwort aus, geben diesmal das Salt ein und vergleichen die resultierende Hash-Zeichenfolge mit dem in Ihrer Datenbank gespeicherten Wert. Argon2, bcrypt und scrypt speichern das Salz bereits mit dem Hash. Weitere Informationen finden Sie in diesem Artikel auf sec.stackexchange.

Der Grund, warum ein Salz verwendet wird, ist, dass das Hashing an sich nicht ausreicht. Sie sollten ein sogenanntes "Salz" hinzufügen, um den Hash vor Regenbogentabellen zu schützen . Ein Salt verhindert effektiv, dass zwei Passwörter, die genau übereinstimmen, als der gleiche Hashwert gespeichert werden, und verhindert, dass die gesamte Datenbank in einem Durchgang gescannt wird, wenn ein Angreifer einen Angriff zum Erraten von Passwörtern ausführt.

Ein kryptografischer Hash sollte nicht zum Speichern von Passwörtern verwendet werden, da vom Benutzer ausgewählte Passwörter nicht stark genug sind (dh normalerweise nicht genügend Entropie enthalten) und ein Angreifer mit Zugriff auf die Hashes in relativ kurzer Zeit einen Angriff zum Erraten von Passwörtern ausführen kann. Aus diesem Grund werden KDFs verwendet - diese "strecken den Schlüssel" effektiv , was bedeutet, dass jede Kennwortschätzung, die ein Angreifer vornimmt, mehrere Wiederholungen des Hash-Algorithmus verursacht, beispielsweise 10.000 Mal, wodurch der Angreifer das Kennwort 10.000 Mal langsamer errät.

Sitzungsdaten - "Sie sind als Spiderman69 angemeldet"

Nachdem der Server die Anmeldung und das Kennwort für Ihre Benutzerdatenbank überprüft und eine Übereinstimmung gefunden hat, muss sich das System daran erinnern, dass der Browser authentifiziert wurde. Diese Tatsache sollte immer nur serverseitig in den Sitzungsdaten gespeichert werden.

Wenn Sie mit Sitzungsdaten nicht vertraut sind, funktioniert dies folgendermaßen: Eine einzelne zufällig generierte Zeichenfolge wird in einem ablaufenden Cookie gespeichert und zum Verweisen auf eine Sammlung von Daten - die Sitzungsdaten - verwendet, die auf dem Server gespeichert sind. Wenn Sie ein MVC-Framework verwenden, wird dies zweifellos bereits behandelt.

Stellen Sie nach Möglichkeit sicher, dass für das Sitzungscookie beim Senden an den Browser die Flags "Sicher" und "Nur HTTP" gesetzt sind. Das HttpOnly-Flag bietet einen gewissen Schutz gegen das Lesen des Cookies durch einen XSS-Angriff. Das sichere Flag stellt sicher, dass das Cookie nur über HTTPS zurückgesendet wird, und schützt daher vor Netzwerk-Sniffing-Angriffen. Der Wert des Cookies sollte nicht vorhersehbar sein. Wenn ein Cookie angezeigt wird, das auf eine nicht vorhandene Sitzung verweist, sollte sein Wert sofort ersetzt werden, um eine Sitzungsfixierung zu verhindern .

TEIL II: So bleiben Sie eingeloggt - Das berüchtigte Kontrollkästchen "Remember Me"

Permanente Login-Cookies ("Remember Me" -Funktionalität) sind eine Gefahrenzone. Einerseits sind sie genauso sicher wie herkömmliche Anmeldungen, wenn Benutzer verstehen, wie sie damit umgehen sollen. Auf der anderen Seite stellen sie ein enormes Sicherheitsrisiko für unachtsame Benutzer dar, die sie möglicherweise auf öffentlichen Computern verwenden und vergessen, sich abzumelden, und die möglicherweise nicht wissen, was Browser-Cookies sind oder wie sie gelöscht werden können.

Persönlich mag ich dauerhafte Anmeldungen für die Websites, die ich regelmäßig besuche, aber ich weiß, wie ich sicher damit umgehen kann. Wenn Sie sicher sind, dass Ihre Benutzer dasselbe wissen, können Sie dauerhafte Anmeldungen mit gutem Gewissen verwenden. Wenn nicht, können Sie sich der Philosophie anschließen, dass Benutzer, die mit ihren Anmeldedaten unachtsam sind, diese selbst in die Hand genommen haben, wenn sie gehackt werden. Es ist nicht so, als würden wir zu den Häusern unserer Benutzer gehen und all die Post-It-Notizen, die die Gesichtspalme auslösen, mit Passwörtern abreißen, die sie am Rand ihrer Monitore aufgereiht haben.

Natürlich leisten einige Systeme nicht haben keine Konten gehackt; Für solche Systeme gibt es keine Möglichkeit, dauerhafte Anmeldungen zu rechtfertigen.

Wenn Sie sich für die Implementierung dauerhafter Anmelde-Cookies entscheiden, gehen Sie folgendermaßen vor:

  1. Nehmen Sie sich zunächst etwas Zeit, um den Artikel der Paragon Initiative zu diesem Thema zu lesen . Sie müssen eine Reihe von Elementen richtig machen, und der Artikel erklärt die einzelnen Elemente hervorragend.

  2. Und um nur eine der häufigsten Fallstricke zu wiederholen, SPEICHERN SIE DAS PERSISTENT LOGIN COOKIE (TOKEN) NICHT IN IHRER DATENBANK, NUR EIN HASH! Das Anmeldetoken ist Passwort-äquivalent. Wenn ein Angreifer Ihre Datenbank in die Hände bekommt, kann er sich mit den Token bei jedem Konto anmelden, als wären es Klartext-Login-Passwort-Kombinationen. Verwenden Sie daher Hashing (laut https://security.stackexchange.com/a/63438/5002 reicht ein schwacher Hash für diesen Zweck aus), wenn Sie persistente Anmeldetoken speichern.

TEIL III: Geheime Fragen verwenden

Implementieren Sie keine "geheimen Fragen" . Die Funktion "Geheime Fragen" ist ein Sicherheits-Anti-Muster. Lesen Sie das Papier von Link Nummer 4 aus der MUST-READ-Liste. Sie können Sarah Palin danach fragen, nachdem ihr Yahoo! E-Mail-Konto wurde während einer früheren Präsidentschaftskampagne gehackt, weil die Antwort auf ihre Sicherheitsfrage ... "Wasilla High School" war!

Selbst bei benutzerdefinierten Fragen ist es sehr wahrscheinlich, dass die meisten Benutzer Folgendes wählen:

  • Eine "normale" geheime Frage wie der Mädchenname der Mutter oder das Lieblingshaustier

  • Eine einfache Kleinigkeit, die jeder aus seinem Blog, LinkedIn-Profil oder ähnlichem herausholen kann

  • Jede Frage, die einfacher zu beantworten ist, als ihr Passwort zu erraten. Was für jedes anständige Passwort jede Frage ist, die Sie sich vorstellen können

Zusammenfassend lässt sich sagen, dass Sicherheitsfragen in praktisch allen Formen und Variationen von Natur aus unsicher sind und aus irgendeinem Grund nicht in einem Authentifizierungsschema verwendet werden sollten.

Der wahre Grund, warum Sicherheitsfragen sogar in der Natur existieren, besteht darin, dass sie bequem die Kosten einiger Supportanrufe von Benutzern sparen, die nicht auf ihre E-Mails zugreifen können, um zu einem Reaktivierungscode zu gelangen. Dies auf Kosten der Sicherheit und des Rufs von Sarah Palin. Es ist es wert? Wahrscheinlich nicht.

TEIL IV: Funktion für vergessenes Passwort

Ich habe bereits erwähnt, warum Sie niemals Sicherheitsfragen für den Umgang mit vergessenen / verlorenen Benutzerkennwörtern verwenden sollten. Es versteht sich auch von selbst, dass Sie Benutzern niemals ihre tatsächlichen Passwörter per E-Mail senden sollten. In diesem Bereich sind mindestens zwei weitere allzu häufige Fallstricke zu vermeiden:

  1. Nicht zurückgesetzt ein vergessenes Kennwort ein automatisch generierter starkes Passwort - solche Passwörter sind notorisch schwer zu merken, die der Benutzer bedeutet entweder ändern müssen oder schreiben Sie es auf - sagen wir, auf einem leuchtend gelben Post-It auf dem Rand ihres Monitors. Anstatt ein neues Passwort festzulegen, lassen Sie die Benutzer sofort ein neues auswählen - was sie sowieso tun möchten. (Eine Ausnahme hiervon kann sein, wenn die Benutzer allgemein einen Kennwortmanager zum Speichern / Verwalten von Kennwörtern verwenden, an die sie sich normalerweise nicht erinnern können, ohne sie aufzuschreiben.)

  2. Hash immer den verlorenen Passwortcode / Token in der Datenbank. WIEDER ist dieser Code ein weiteres Beispiel für ein Passwort-Äquivalent. Er MUSS also gehasht werden, falls ein Angreifer Ihre Datenbank in die Hände bekommt. Wenn ein verlorener Passwortcode angefordert wird, senden Sie den Klartextcode an die E-Mail-Adresse des Benutzers, hashen Sie ihn, speichern Sie den Hash in Ihrer Datenbank - und werfen Sie das Original weg . Genau wie ein Passwort oder ein dauerhaftes Login-Token.

Ein letzter Hinweis: Stellen Sie immer sicher, dass Ihre Schnittstelle zur Eingabe des Codes für verlorenes Passwort mindestens so sicher ist wie Ihr Anmeldeformular selbst. Andernfalls verwendet ein Angreifer dies einfach, um stattdessen Zugriff zu erhalten. Es ist ein guter Anfang, sicherzustellen, dass Sie sehr lange "verlorene Kennwortcodes" generieren (z. B. 16 alphanumerische Zeichen, bei denen zwischen Groß- und Kleinschreibung unterschieden wird). Fügen Sie jedoch dasselbe Drosselungsschema hinzu, das Sie für das Anmeldeformular selbst verwenden.

TEIL V: Überprüfen der Passwortstärke

Zunächst sollten Sie diesen kleinen Artikel lesen, um die Realität zu überprüfen: Die 500 häufigsten Passwörter

Okay, vielleicht die Liste ist nicht die kanonische Liste der häufigsten Passwörter auf jedem System überall immer , aber es ist ein guter Indikator dafür , wie schlecht die Menschen ihre Passwörter wählen , wenn es keine erzwungene Politik an seinem Platz ist. Außerdem sieht die Liste erschreckend nah an der Heimat aus, wenn Sie sie mit öffentlich verfügbaren Analysen kürzlich gestohlener Passwörter vergleichen.

Also: Ohne Mindestanforderungen an die Kennwortstärke verwenden 2% der Benutzer eines der 20 häufigsten Kennwörter. Das heißt: Wenn ein Angreifer nur 20 Versuche erhält, kann 1 von 50 Konten auf Ihrer Website geknackt werden.

Um dies zu verhindern, muss die Entropie eines Passworts berechnet und anschließend ein Schwellenwert angewendet werden. Die Sonderpublikation 800-63 des Nationalen Instituts für Standards und Technologie (NIST) enthält eine Reihe sehr guter Vorschläge. In Kombination mit einer Wörterbuch- und Tastaturlayoutanalyse (z. B. "qwertyuiop" ist ein falsches Kennwort) können 99% aller schlecht ausgewählten Kennwörter mit einer Entropie von 18 Bit abgelehnt werden . Die einfache Berechnung der Passwortstärke und die Anzeige eines visuellen Stärkemessgeräts für einen Benutzer ist gut, aber unzureichend. Wenn es nicht erzwungen wird, werden viele Benutzer es höchstwahrscheinlich ignorieren.

Randall Munroes Password Strength xkcd wird dringend empfohlen, um die Benutzerfreundlichkeit von Passwörtern mit hoher Entropie aufzufrischen .

Verwenden Sie die API von Troy Hunt , um Benutzerpasswörter anhand von Passwörtern zu überprüfen, die bei Verstößen gegen öffentliche Daten gefährdet sind.

TEIL VI: Viel mehr - oder: Verhindern von schnellen Anmeldeversuchen

Schauen Sie sich zunächst die Zahlen an: Kennwortwiederherstellungsgeschwindigkeiten - Wie lange hält Ihr Kennwort?

Wenn Sie nicht die Zeit haben, die Tabellen in diesem Link zu durchsuchen, finden Sie hier eine Liste:

  1. Es dauert praktisch keine Zeit , ein schwaches Passwort zu knacken, selbst wenn Sie es mit einem Abakus knacken

  2. Es dauert praktisch keine Zeit , ein alphanumerisches 9-stelliges Passwort zu knacken, wenn die Groß- und Kleinschreibung nicht berücksichtigt wird

  3. Wenn es weniger als 8 Zeichen lang ist, dauert es praktisch keine Zeit , ein kompliziertes Kennwort mit Symbolen, Buchstaben und Zahlen sowie Groß- und Kleinbuchstaben zu knacken (ein Desktop-PC kann den gesamten Schlüsselbereich mit bis zu 7 Zeichen durchsuchen von Tagen oder sogar Stunden)

  4. Es würde jedoch übermäßig viel Zeit in Anspruch nehmen, selbst ein 6-stelliges Passwort zu knacken, wenn Sie auf einen Versuch pro Sekunde beschränkt wären!

Was können wir also aus diesen Zahlen lernen? Nun, viele, aber wir können uns auf den wichtigsten Teil konzentrieren: Die Tatsache, dass es wirklich nicht so schwierig ist , eine große Anzahl aufeinanderfolgender Schnellfeuer-Anmeldeversuche (dh den Brute-Force- Angriff) zu verhindern. Aber es richtig zu verhindern ist nicht so einfach, wie es scheint.

Im Allgemeinen haben Sie drei Möglichkeiten , die alle wirksam gegen Brute-Force - Angriffe sind (und Wörterbuch - Attacken, aber da Sie bereits eine starke Passwort Politik beschäftigen, sollten sie nicht ein Problem sein) :

  • Präsentieren Sie ein CAPTCHA nach N fehlgeschlagenen Versuchen (verdammt nervig und oft ineffektiv - aber ich wiederhole mich hier)

  • Sperren von Konten und Erfordernis einer E-Mail-Überprüfung nach N fehlgeschlagenen Versuchen (dies ist ein DoS- Angriff, der darauf wartet, ausgeführt zu werden)

  • Und schließlich die Drosselung der Anmeldung : Das heißt, eine Zeitverzögerung zwischen den Versuchen nach N fehlgeschlagenen Versuchen festlegen (ja, DoS-Angriffe sind immer noch möglich, aber zumindest sind sie weitaus weniger wahrscheinlich und viel komplizierter durchzuführen).

Best Practice Nr. 1: Eine kurze Zeitverzögerung, die mit der Anzahl der fehlgeschlagenen Versuche zunimmt, wie z.

  • 1 fehlgeschlagener Versuch = keine Verzögerung
  • 2 fehlgeschlagene Versuche = 2 Sekunden Verzögerung
  • 3 fehlgeschlagene Versuche = 4 Sekunden Verzögerung
  • 4 fehlgeschlagene Versuche = 8 Sekunden Verzögerung
  • 5 fehlgeschlagene Versuche = 16 Sekunden Verzögerung
  • usw.

Ein DoS, der dieses Schema angreift, wäre sehr unpraktisch, da die resultierende Sperrzeit geringfügig größer ist als die Summe der vorherigen Sperrzeiten.

Zur Verdeutlichung: Die Verzögerung ist keine Verzögerung, bevor die Antwort an den Browser zurückgegeben wird. Es ist eher eine Zeitüberschreitung oder ein Refraktärzeitraum, in dem Anmeldeversuche bei einem bestimmten Konto oder von einer bestimmten IP-Adresse überhaupt nicht akzeptiert oder ausgewertet werden. Das heißt, korrekte Anmeldeinformationen werden bei einer erfolgreichen Anmeldung nicht zurückgegeben, und falsche Anmeldeinformationen lösen keine Verzögerungserhöhung aus.

Best Practice Nr. 2: Eine Zeitverzögerung mittlerer Länge, die nach N fehlgeschlagenen Versuchen wirksam wird, wie z.

  • 1-4 fehlgeschlagene Versuche = keine Verzögerung
  • 5 fehlgeschlagene Versuche = 15-30 Minuten Verzögerung

DoS, die dieses Schema angreifen, wären ziemlich unpraktisch, aber sicherlich machbar. Es kann auch relevant sein zu beachten, dass eine so lange Verzögerung für einen legitimen Benutzer sehr ärgerlich sein kann. Vergessliche Benutzer werden dich nicht mögen.

Best Practice Nr. 3: Kombination der beiden Ansätze - entweder eine feste, kurze Zeitverzögerung, die nach N fehlgeschlagenen Versuchen wirksam wird, wie z.

  • 1-4 fehlgeschlagene Versuche = keine Verzögerung
  • 5+ fehlgeschlagene Versuche = 20 Sekunden Verzögerung

Oder eine zunehmende Verzögerung mit einer festen Obergrenze, wie:

  • 1 fehlgeschlagener Versuch = 5 Sek. Verzögerung
  • 2 fehlgeschlagene Versuche = 15 Sekunden Verzögerung
  • 3+ fehlgeschlagene Versuche = 45 Sekunden Verzögerung

Dieses endgültige Schema wurde den OWASP-Best-Practice-Vorschlägen (Link 1 aus der MUST-READ-Liste) entnommen und sollte als Best-Practice angesehen werden, auch wenn es zugegebenermaßen restriktiv ist.

Als Faustregel würde ich jedoch sagen: Je stärker Ihre Passwortrichtlinie ist, desto weniger müssen Sie Benutzer mit Verzögerungen nerven. Wenn Sie sichere (alphanumerische Zeichen + Groß- und Kleinschreibung + erforderliche Zahlen und Symbole) Kennwörter mit mehr als 9 Zeichen benötigen, können Sie den Benutzern 2-4 nicht verzögerte Kennwortversuche geben, bevor Sie die Drosselung aktivieren.

Ein Angriff auf dieses endgültige Anmeldedrosselungsschema wäre sehr unpraktisch. Lassen Sie als letzten Schliff immer dauerhafte (Cookie-) Anmeldungen (und / oder ein von CAPTCHA verifiziertes Anmeldeformular) durch, damit legitime Benutzer nicht einmal verzögert werden, während der Angriff ausgeführt wird . Auf diese Weise wird der sehr unpraktische DoS-Angriff zu einem äußerst unpraktischen Angriff.

Darüber hinaus ist es sinnvoller, Administratorkonten aggressiver zu drosseln, da dies die attraktivsten Einstiegspunkte sind

TEIL VII: Verteilte Brute-Force-Angriffe

Abgesehen davon werden fortgeschrittenere Angreifer versuchen, die Drosselung der Anmeldung zu umgehen, indem sie "ihre Aktivitäten verbreiten":

  • Verteilen der Versuche in einem Botnetz, um das Markieren von IP-Adressen zu verhindern

  • Anstatt einen Benutzer auszuwählen und die 50.000 häufigsten Passwörter auszuprobieren (was sie aufgrund unserer Drosselung nicht können), wählen sie DAS häufigste Passwort aus und versuchen es stattdessen mit 50.000 Benutzern. Auf diese Weise umgehen sie nicht nur Maßnahmen mit maximalem Versuch wie CAPTCHAs und Anmeldedrosselung, sondern erhöhen auch ihre Erfolgschancen, da das häufigste Kennwort Nummer 1 weitaus wahrscheinlicher ist als Nummer 49.995

  • Abstand der Anmeldeanforderungen für jedes Benutzerkonto, z. B. im Abstand von 30 Sekunden, um sich unter das Radar zu schleichen

Hier empfiehlt es sich, die Anzahl der fehlgeschlagenen Anmeldungen systemweit zu protokollieren und einen laufenden Durchschnitt der Häufigkeit der fehlerhaften Anmeldungen Ihrer Site als Grundlage für eine Obergrenze zu verwenden, die Sie dann allen Benutzern auferlegen.

Zu abstrakt? Lassen Sie mich umformulieren:

Angenommen, Ihre Website hat in den letzten 3 Monaten durchschnittlich 120 fehlerhafte Anmeldungen pro Tag erhalten. Mit diesem (laufenden Durchschnitt) kann Ihr System das globale Limit auf das Dreifache festlegen - dh. 360 fehlgeschlagene Versuche über einen Zeitraum von 24 Stunden. Wenn dann die Gesamtzahl der fehlgeschlagenen Versuche in allen Konten diese Anzahl innerhalb eines Tages überschreitet (oder noch besser, überwachen Sie die Beschleunigungsrate und lösen Sie einen berechneten Schwellenwert aus), wird die systemweite Anmeldedrosselung aktiviert - was für ALLE Benutzer kurze Verzögerungen bedeutet (mit Ausnahme von Cookie-Anmeldungen und / oder Backup-CAPTCHA-Anmeldungen).

Ich habe auch eine Frage mit mehr Details und einer wirklich guten Diskussion darüber gepostet, wie man knifflige Pitfals bei der Abwehr verteilter Brute-Force-Angriffe vermeidet

TEIL VIII: Zwei-Faktor-Authentifizierung und Authentifizierungsanbieter

Anmeldeinformationen können gefährdet sein, sei es durch Exploits, das Aufschreiben und Verlieren von Passwörtern, den Diebstahl von Laptops mit Schlüsseln oder die Eingabe von Anmeldungen bei Phishing-Sites durch Benutzer. Anmeldungen können durch eine Zwei-Faktor-Authentifizierung weiter geschützt werden, bei der Out-of-Band-Faktoren wie Einwegcodes verwendet werden, die von einem Telefonanruf, einer SMS-Nachricht, einer App oder einem Dongle empfangen wurden. Mehrere Anbieter bieten Zwei-Faktor-Authentifizierungsdienste an.

Die Authentifizierung kann vollständig an einen Single-Sign-On-Dienst delegiert werden, bei dem ein anderer Anbieter das Sammeln von Anmeldeinformationen übernimmt. Dadurch wird das Problem an einen vertrauenswürdigen Dritten weitergeleitet. Google und Twitter bieten beide standardbasierte SSO-Dienste an, während Facebook eine ähnliche proprietäre Lösung bietet.

MUSS LINKS ÜBER DIE Webauthentifizierung LESEN

  1. OWASP-Handbuch zur Authentifizierung / OWASP-Authentifizierung Cheat Sheet
  2. Vor- und Nachteile der Clientauthentifizierung im Web (gut lesbares MIT-Forschungspapier)
  3. Wikipedia: HTTP-Cookie
  4. Persönliche Wissensfragen zur Fallback-Authentifizierung: Sicherheitsfragen im Zeitalter von Facebook (gut lesbares Berkeley-Forschungspapier)

67
Nun, ich stimme dem Captcha-Teil nicht wirklich zu, ja, Captchas sind ärgerlich und können kaputt gehen (außer Recaptcha, aber das ist für Menschen kaum lösbar!), Aber das ist genau so, als würde man sagen, dass man keinen Spam-Filter verwendet, weil es so ist weniger als 0,1% falsch negative Ergebnisse. Diese Website verwendet Captchas. Sie sind nicht perfekt, aber sie schneiden eine beträchtliche Menge an Spam ab und es gibt einfach keine gute Alternative zu ihnen
Waleed Eissa

235
@ Jeff: Es tut mir leid zu hören, dass Sie Probleme mit meiner Antwort haben. Ich wusste nicht, dass es eine Debatte über Meta über diese Antwort gibt. Ich hätte sie gerne selbst bearbeitet, wenn Sie mich darum gebeten hätten. Und das Löschen meiner Beiträge löschte gerade 1200 Ruf von meinem Konto, was weh tut :(
Jens Roland

13
"Nach dem Senden der Authentifizierungstoken muss sich das System daran erinnern, dass Sie authentifiziert wurden. Diese Tatsache sollte immer nur serverseitig in den Sitzungsdaten gespeichert werden. Ein Cookie kann verwendet werden, um auf die Sitzungsdaten zu verweisen." Nicht ganz. Sie können (und sollten für zustandslose Server!) Ein kryptografisch signiertes Cookie verwenden. Das ist unmöglich zu fälschen, bindet keine Serverressourcen und benötigt keine Sticky Sessions oder andere Spielereien.
Martin Probst

12
"Ein Desktop-PC kann den VOLLSTÄNDIGEN TASTATUR in weniger als 90 Tagen mit bis zu 7 Zeichen durchsuchen." Ein Computer mit einer aktuellen GPU kann den gesamten 7-Zeichen-Schlüsselbereich in weniger als 1 Tag durchsuchen. Eine erstklassige GPU kann 1 Milliarde Hashes pro Sekunde verwalten. golubev.com/hashgpu.htm Dies führt zu einigen Schlussfolgerungen zur Kennwortspeicherung, die nicht direkt angesprochen werden.
Frank Farmer

9
Ich bin überrascht, dass CSRF-Schutz nicht erwähnt wurde ...
Flukey

418

Endgültiger Artikel

Anmeldeinformationen senden

Die einzige praktische Möglichkeit, Anmeldeinformationen 100% sicher zu senden, ist die Verwendung von SSL . Die Verwendung von JavaScript zum Hashing des Kennworts ist nicht sicher. Häufige Fallstricke beim clientseitigen Passwort-Hashing:

  • Wenn die Verbindung zwischen Client und Server unverschlüsselt ist, ist alles, was Sie tun, anfällig für Man-in-the-Middle-Angriffe . Ein Angreifer könnte das eingehende Javascript ersetzen, um das Hashing zu unterbrechen, oder alle Anmeldeinformationen an seinen Server senden, er könnte Client-Antworten abhören und sich perfekt als Benutzer ausgeben usw. usw. SSL mit vertrauenswürdigen Zertifizierungsstellen soll MitM-Angriffe verhindern.
  • Das vom Server empfangene Hash-Passwort ist weniger sicher, wenn Sie keine zusätzlichen redundanten Arbeiten am Server ausführen.

Es gibt eine andere sichere Methode namens SRP , die jedoch patentiert ist (obwohl sie frei lizenziert ist ) und nur wenige gute Implementierungen verfügbar sind.

Passwörter speichern

Speichern Sie niemals Passwörter als Klartext in der Datenbank. Nicht einmal, wenn Sie sich nicht um die Sicherheit Ihrer eigenen Website kümmern. Angenommen, einige Ihrer Benutzer verwenden das Kennwort ihres Online-Bankkontos erneut. Speichern Sie also das Hash-Passwort und werfen Sie das Original weg. Stellen Sie außerdem sicher, dass das Kennwort nicht in Zugriffsprotokollen oder Anwendungsprotokollen angezeigt wird. OWASP empfiehlt die Verwendung von Argon2 als erste Wahl für neue Anwendungen. Wenn dies nicht verfügbar ist, sollte stattdessen PBKDF2 oder scrypt verwendet werden. Und wenn keine der oben genannten Optionen verfügbar ist, verwenden Sie bcrypt.

Hashes an sich sind auch unsicher. Zum Beispiel bedeuten identische Passwörter identische Hashes - dies macht Hash-Nachschlagetabellen zu einer effektiven Methode, um viele Passwörter gleichzeitig zu knacken. Bewahren Sie stattdessen den gesalzenen Hasch auf. Ein Salt ist eine Zeichenfolge, die vor dem Hashing an das Kennwort angehängt wird. Verwenden Sie pro Benutzer ein anderes (zufälliges) Salt. Das Salt ist ein öffentlicher Wert, sodass Sie sie mit dem Hash in der Datenbank speichern können. Weitere Informationen hierzu finden Sie hier .

Dies bedeutet, dass Sie dem Benutzer keine vergessenen Passwörter senden können (da Sie nur den Hash haben). Setzen Sie das Kennwort des Benutzers nur zurück, wenn Sie den Benutzer authentifiziert haben (Benutzer müssen nachweisen, dass sie E-Mails lesen können, die an die gespeicherte (und validierte) E-Mail-Adresse gesendet wurden.)

Sicherheitsfragen

Sicherheitsfragen sind unsicher - vermeiden Sie ihre Verwendung. Warum? Alles, was eine Sicherheitsfrage tut, ist ein Passwort besser. Lesen Sie TEIL III: Verwenden geheimer Fragen in @Jens Rolands Antwort hier in diesem Wiki.

Sitzungscookies

Nachdem sich der Benutzer angemeldet hat, sendet der Server dem Benutzer ein Sitzungscookie. Der Server kann den Benutzernamen oder die ID aus dem Cookie abrufen, aber niemand anderes kann ein solches Cookie generieren (TODO-Erklärungsmechanismen).

Cookies können entführt werden : Sie sind nur so sicher wie der Rest des Client-Computers und andere Kommunikationen. Sie können von der Festplatte gelesen, im Netzwerkverkehr beschnüffelt, durch einen Cross-Site-Scripting-Angriff aufgehoben und von einem vergifteten DNS phishing-fähig gemacht werden, sodass der Client seine Cookies an die falschen Server sendet. Senden Sie keine dauerhaften Cookies. Cookies sollten am Ende der Client-Sitzung ablaufen (Browser schließen oder Domain verlassen).

Wenn Sie Ihre Benutzer automatisch anmelden möchten, können Sie ein dauerhaftes Cookie festlegen, das sich jedoch von einem Cookie für eine vollständige Sitzung unterscheiden sollte. Sie können ein zusätzliches Flag setzen, für das sich der Benutzer automatisch angemeldet hat und das sich für vertrauliche Vorgänge für echt anmelden muss. Dies ist beliebt bei Einkaufsseiten, die Ihnen ein nahtloses, personalisiertes Einkaufserlebnis bieten und dennoch Ihre finanziellen Daten schützen möchten. Wenn Sie beispielsweise zu Amazon zurückkehren, wird eine Seite angezeigt, die aussieht, als wären Sie angemeldet. Wenn Sie jedoch eine Bestellung aufgeben (oder Ihre Lieferadresse, Kreditkarte usw. ändern), werden Sie zur Bestätigung aufgefordert Ihr Passwort.

Finanzwebsites wie Banken und Kreditkarten enthalten hingegen nur vertrauliche Daten und sollten keine automatische Anmeldung oder einen Modus mit geringer Sicherheit zulassen.

Liste der externen Ressourcen


1
Angesichts der jüngsten MITM-Sicherheitslücke in Bezug auf signierte SSL-Zertifikate ( blog.startcom.org/?p=145 ) ist eine Kombination aus SSL und einer Art Challenge-Antwortauthentifizierung (es gibt Alternativen zu SRP) wahrscheinlich die bessere Lösung.
Kevin Loney

Vieles davon ist situativ. Ich neige dazu, überhaupt keine Sitzungscookies zu verwenden. Cookies, die entführt werden, sind fast immer die Schuld des Servers. Mann in der Mitte / Paket schnüffeln nicht so häufig
Shawn


1
Anmerkung 1 zu dieser Antwort: Es handelt sich um einen Entwurf, der als Wiki bearbeitet werden kann. Wenn Sie dies bearbeiten können, sind Sie herzlich willkommen.
Peter Mortensen

SRP ist spezifisch für die Anwesenheit mehrerer Parteien, wenn ich gut verstehe
Webwoman

162

Erstens eine starke Einschränkung, dass diese Antwort nicht genau zu dieser Frage passt. Es sollte definitiv nicht die Top-Antwort sein!

Ich werde Mozillas vorgeschlagene BrowserID (oder genauer gesagt das verifizierte E-Mail-Protokoll ) erwähnen , um in Zukunft einen Upgrade-Pfad für bessere Ansätze zur Authentifizierung zu finden.

Ich werde es so zusammenfassen:

  1. Mozilla ist eine gemeinnützige Organisation mit Werten , die gut dazu passen, gute Lösungen für dieses Problem zu finden.
  2. Die heutige Realität ist, dass die meisten Websites eine formularbasierte Authentifizierung verwenden
  3. Die formularbasierte Authentifizierung hat einen großen Nachteil, nämlich ein erhöhtes Phishing- Risiko . Benutzer werden aufgefordert, vertrauliche Informationen in einen Bereich einzugeben, der von einer Remote-Entität kontrolliert wird, und nicht in einen Bereich, der von ihrem User Agent (Browser) kontrolliert wird.
  4. Da Browser implizit vertrauenswürdig sind (die gesamte Idee eines Benutzeragenten besteht darin, im Namen des Benutzers zu handeln), können sie zur Verbesserung dieser Situation beitragen.
  5. Die Hauptkraft, die den Fortschritt hier zurückhält, ist der Deadlock bei der Bereitstellung . Lösungen müssen in Schritte zerlegt werden, die für sich genommen einen zusätzlichen Nutzen bieten.
  6. Die einfachste dezentrale Methode zum Ausdrücken einer in die Internetinfrastruktur integrierten Identität ist der Domänenname.
  7. Als zweite Ebene des Identitätsausdrucks verwaltet jede Domäne ihre eigenen Konten.
  8. Das Formular „ @Kontodomäne“ ist übersichtlich und wird von einer Vielzahl von Protokollen und URI-Schemata unterstützt. Eine solche Kennung wird natürlich am allgemeinsten als E-Mail-Adresse anerkannt.
  9. E-Mail-Anbieter sind bereits de facto die primären Identitätsanbieter online. Mit den aktuellen Kennwortrücksetzabläufen können Sie normalerweise die Kontrolle über ein Konto übernehmen, wenn Sie nachweisen können, dass Sie die zugehörige E-Mail-Adresse dieses Kontos kontrollieren.
  10. Das verifizierte E-Mail-Protokoll wurde vorgeschlagen, um eine sichere Methode auf der Grundlage der Kryptografie mit öffentlichen Schlüsseln bereitzustellen, mit der der Nachweis für Domäne B, dass Sie ein Konto in Domäne A haben, optimiert werden kann.
  11. Für Browser, die das verifizierte E-Mail-Protokoll nicht unterstützen (derzeit alle), bietet Mozilla einen Shim, der das Protokoll in clientseitigem JavaScript-Code implementiert.
  12. Bei E-Mail-Diensten, die das verifizierte E-Mail-Protokoll nicht unterstützen, können Dritte als vertrauenswürdiger Vermittler fungieren und behaupten, dass sie den Besitz eines Benutzers an einem Konto überprüft haben. Es ist nicht wünschenswert, eine große Anzahl solcher Dritter zu haben; Diese Funktion soll nur einen Upgrade-Pfad zulassen, und es wird sehr bevorzugt, dass E-Mail-Dienste diese Behauptungen selbst bereitstellen.
  13. Mozilla bietet einen eigenen Service an, um sich wie ein vertrauenswürdiger Dritter zu verhalten. Dienstanbieter (dh vertrauende Parteien), die das verifizierte E-Mail-Protokoll implementieren, können entscheiden, ob sie den Behauptungen von Mozilla vertrauen oder nicht. Der Mozilla-Dienst überprüft den Besitz des Benutzerkontos mithilfe der herkömmlichen Methode zum Senden einer E-Mail mit einem Bestätigungslink.
  14. Dienstanbieter können dieses Protokoll natürlich als Option zusätzlich zu anderen Authentifizierungsmethoden anbieten, die sie möglicherweise anbieten möchten.
  15. Ein großer Vorteil der Benutzeroberfläche, der hier angestrebt wird, ist der „Identitätsselektor“. Wenn ein Benutzer eine Website besucht und sich authentifiziert, zeigt ihm sein Browser eine Auswahl von E-Mail-Adressen ("persönlich", "Arbeit", "politischer Aktivismus" usw.) an, mit denen er sich auf der Website identifizieren kann.
  16. Ein weiterer großer Vorteil der Benutzeroberfläche, der im Rahmen dieser Bemühungen angestrebt wird, besteht darin, dem Browser zu helfen, mehr über die Sitzung des Benutzers zu erfahren - bei der er hauptsächlich angemeldet ist -, sodass dies möglicherweise im Browser-Chrome angezeigt wird.
  17. Aufgrund der Verbreitung dieses Systems wird die Anbindung an wichtige Websites wie Facebook, Twitter, Google usw. vermieden. Jede Person kann ihre eigene Domain besitzen und somit als eigener Identitätsanbieter fungieren.

Dies ist keine reine "formularbasierte Authentifizierung für Websites". Es ist jedoch ein Versuch, von der aktuellen Norm der formularbasierten Authentifizierung zu etwas Sichererem überzugehen: der browserunterstützten Authentifizierung.


3
BrowserID Link ist tot
Mehdi Bounya

Das Projekt scheint eingemottet worden zu sein ... siehe en.wikipedia.org/wiki/Mozilla_Persona
Jeff Olson

138

Ich dachte nur, ich würde diese Lösung teilen, die meiner Meinung nach gut funktioniert.

Ich nenne es das Dummy Field (obwohl ich das nicht erfunden habe, also schreibe es mir nicht gut).

Kurz gesagt: Sie müssen dies nur in Ihre einfügen <form>und prüfen, ob es bei der Validierung leer ist:

<input type="text" name="email" style="display:none" />

Der Trick besteht darin, einen Bot zu täuschen, er müsse Daten in ein erforderliches Feld einfügen. Deshalb habe ich die Eingabe "E-Mail" genannt. Wenn Sie bereits ein Feld namens E-Mail haben, das Sie verwenden, sollten Sie versuchen, das Dummy-Feld mit einem anderen Namen wie "Firma", "Telefon" oder "E-Mail-Adresse" zu benennen. Wählen Sie einfach etwas aus, von dem Sie wissen, dass Sie es nicht benötigen und das sich nach etwas anhört, das normalerweise logisch ist, um es in ein Webformular auszufüllen. Verstecken Sie nun das inputFeld mit CSS oder JavaScript / jQuery - was auch immer am besten zu Ihnen passt - setzen Sie die Eingabe einfach nicht auf type, hiddensonst fällt der Bot nicht darauf herein.

Wenn Sie das Formular validieren (entweder clientseitig oder serverseitig), überprüfen Sie, ob Ihr Dummy-Feld ausgefüllt wurde, um festzustellen, ob es von einem Menschen oder einem Bot gesendet wurde.

Beispiel:

Im Falle eines Menschen: Der Benutzer sieht das Dummy-Feld (in meinem Fall "E-Mail") nicht und versucht nicht, es zu füllen. Der Wert des Dummy-Felds sollte also nach dem Senden des Formulars noch leer sein.

Im Falle eines Bots: Der Bot sieht ein Feld, dessen Typ textund Name email(oder wie auch immer Sie es nennen) ist, und versucht logisch, es mit geeigneten Daten zu füllen. Es ist egal, ob Sie das Eingabeformular mit ausgefallenem CSS gestaltet haben, Webentwickler tun dies die ganze Zeit. Was auch immer der Wert im Dummy-Feld ist, es ist uns egal, solange es größer als 0Zeichen ist.

Ich habe diese Methode in einem Gästebuch in Kombination mit CAPTCHA verwendet und seitdem keinen einzigen Spam-Beitrag mehr gesehen. Ich hatte zuvor eine reine CAPTCHA-Lösung verwendet, aber schließlich kam es zu ungefähr fünf Spam-Posts pro Stunde. Das Hinzufügen des Dummy-Felds zum Formular hat (zumindest bis jetzt) ​​das Auftreten von Spam verhindert.

Ich glaube, dass dies auch gut mit einem Anmelde- / Authentifizierungsformular verwendet werden kann.

Warnung : Natürlich ist diese Methode nicht 100% narrensicher. Bots können so programmiert werden, dass Eingabefelder mit dem darauf display:noneangewendeten Stil ignoriert werden . Sie müssen auch an Personen denken, die eine Form der automatischen Vervollständigung verwenden (wie die meisten Browser bereits integriert sind!), Um alle Formularfelder für sie automatisch auszufüllen. Sie könnten genauso gut ein Dummy-Feld aufnehmen.

Sie können dies auch ein wenig variieren, indem Sie das Dummy-Feld sichtbar lassen, jedoch außerhalb der Bildschirmgrenzen. Dies liegt jedoch ganz bei Ihnen.

Seien Sie kreativ!


33
Dies ist ein nützlicher Anti-Spam-Trick, aber ich würde vorschlagen, einen anderen Feldnamen als "E-Mail" zu verwenden, oder Sie stellen fest, dass der Browser ihn automatisch ausfüllt und versehentlich echte Benutzer Ihrer Website blockiert.
Nico Burns

8
Ich habe auch einige mehr dieser verwendet visibility:hiddenund auch position:absolute;top:-9000pxkönnen Sie auch tun , text-indentund auch z-indexauf ein paar dieser Elemente und legen Sie sie in komprimierter CSS Dateinamen mit unbeholfenen Namen - da Bots erkennen 1Rufen: none` und prüfen sie jetzt für eine Reihe von Kombinationen - Ich benutze diese Methoden tatsächlich und sie sind alte Tricks des Handels. +1
TheBlackBenzKid

18
Was passiert, wenn ein Benutzer mit einer Sehbehinderung einen Bildschirmleser verwendet, um im Formular zu navigieren?
Sojabohnenöl

8
Diese Technik hat einen Namen: der Honeypot en.wikipedia.org/wiki/Honeypot_(computing)
Pixeline

27
Kein Inline-Styling erforderlich. Fügen Sie dem Feld einfach eine Klasse hinzu (verwenden Sie möglicherweise ein seltsames Wort, das einem Bot niemals etwas bedeuten könnte) und verstecken Sie es über die CSS-Datei der Site. Wie: <input type="text" name="email" class="cucaracha">und in Ihrem CSS : .cucaracha { display:none; }.
Ricardo Zea

81

Ich denke nicht, dass die obige Antwort "falsch" ist, aber es gibt große Bereiche der Authentifizierung, die nicht berührt werden (oder vielmehr liegt der Schwerpunkt auf "Implementieren von Cookie-Sitzungen", nicht auf "Welche Optionen stehen zur Verfügung und was ist der Handel?" -offs ".

Meine vorgeschlagenen Änderungen / Antworten sind

  • Das Problem liegt mehr in der Kontoeinrichtung als in der Kennwortprüfung.
  • Die Verwendung der Zwei-Faktor-Authentifizierung ist viel sicherer als die cleverere Methode zur Kennwortverschlüsselung
  • Versuchen Sie NICHT, Ihr eigenes Anmeldeformular oder die Datenbankspeicherung von Passwörtern zu implementieren, es sei denn, die gespeicherten Daten sind bei der Kontoerstellung wertlos und werden selbst generiert (dh im Web 2.0-Stil wie Facebook, Flickr usw.).

    1. Die Digest-Authentifizierung ist ein standardbasierter Ansatz, der von allen gängigen Browsern und Servern unterstützt wird und selbst über einen sicheren Kanal kein Kennwort sendet.

Dadurch wird vermieden, dass "Sitzungen" oder Cookies erforderlich sind, da der Browser selbst die Kommunikation jedes Mal neu verschlüsselt. Es ist der "leichteste" Entwicklungsansatz.

Ich empfehle dies jedoch nicht, außer für öffentliche, geringwertige Dienste. Dies ist ein Problem mit einigen der oben genannten Antworten. Versuchen Sie nicht, serverseitige Authentifizierungsmechanismen erneut zu implementieren. Dieses Problem wurde behoben und wird von den meisten gängigen Browsern unterstützt. Verwenden Sie keine Cookies. Speichern Sie nichts in Ihrer eigenen handgerollten Datenbank. Fragen Sie einfach pro Anfrage, ob die Anfrage authentifiziert ist. Alles andere sollte durch Konfiguration und vertrauenswürdige Software von Drittanbietern unterstützt werden.

Damit ...

Zunächst verwechseln wir die erstmalige Erstellung eines Kontos (mit einem Passwort) mit der anschließenden Überprüfung des Passworts. Wenn ich Flickr bin und Ihre Website zum ersten Mal erstelle, hat der neue Benutzer Zugriff auf den Wert Null (leerer Webspace). Es ist mir wirklich egal, ob die Person, die das Konto erstellt, über ihren Namen lügt. Wenn ich ein Konto des Krankenhauses erschaffe Intranet / Extranet, liegt der Wert in allen medizinischen Aufzeichnungen, und so ich tun kümmern uns um die Identität (*) des Kontos Schöpfer.

Dies ist der sehr sehr schwierige Teil. Die einzig vernünftige Lösung ist ein Netz des Vertrauens. Zum Beispiel treten Sie als Arzt ins Krankenhaus ein. Sie erstellen eine Webseite, die irgendwo mit Ihrem Foto, Ihrer Passnummer und einem öffentlichen Schlüssel gehostet wird, und hashen sie alle mit dem privaten Schlüssel. Anschließend besuchen Sie das Krankenhaus und der Systemadministrator überprüft Ihren Reisepass, prüft, ob das Foto zu Ihnen passt, und hasht dann die Webseite / den Foto-Hash mit dem privaten Schlüssel des Krankenhauses. Von nun an können wir Schlüssel und Token sicher austauschen. Wie jeder, der dem Krankenhaus vertraut (es gibt übrigens die geheime Sauce). Der Systemadministrator kann Ihnen auch einen RSA- Dongle oder eine andere Zwei-Faktor-Authentifizierung geben.

Dies ist jedoch ein großer Aufwand und nicht sehr Web 2.0. Dies ist jedoch die einzige sichere Möglichkeit, neue Konten zu erstellen, die Zugriff auf wertvolle Informationen haben, die nicht selbst erstellt wurden.

  1. Kerberos und SPNEGO - Single Sign-On-Mechanismen mit einem vertrauenswürdigen Dritten - Der Benutzer überprüft im Grunde genommen einen vertrauenswürdigen Dritten. (NB dies ist in keiner Weise die nicht vertrauenswürdige OAuth )

  2. SRP - eine Art clevere Passwortauthentifizierung ohne vertrauenswürdigen Dritten. Aber hier kommen wir zu den Bereichen "Es ist sicherer, die Zwei-Faktor-Authentifizierung zu verwenden, auch wenn dies teurer ist".

  3. SSL- Client-Seite - Geben Sie den Clients ein Public-Key-Zertifikat (Unterstützung in allen gängigen Browsern - wirft jedoch Fragen zur Sicherheit des Client-Computers auf).

Am Ende ist es ein Kompromiss - was kostet eine Sicherheitsverletzung im Vergleich zu den Kosten für die Implementierung sicherer Ansätze? Eines Tages wird möglicherweise eine ordnungsgemäße PKI allgemein akzeptiert und daher keine eigenen gerollten Authentifizierungsformulare und -datenbanken mehr. Eines Tages...


29
Schwer zu sagen, über welche Antwort Sie in "Ich glaube nicht, dass die obige Antwort" falsch "ist"
sprechen

55

Verwenden Sie beim Hashing keine schnellen Hash-Algorithmen wie MD5 (es gibt viele Hardware-Implementierungen). Verwenden Sie so etwas wie SHA-512. Bei Passwörtern sind langsamere Hashes besser.

Je schneller Sie Hashes erstellen können, desto schneller kann jeder Brute-Force-Checker arbeiten. Langsamere Hashes verlangsamen daher das brutale Forcen. Ein langsamer Hash-Algorithmus macht Brute Forcing für längere Passwörter (8 Stellen +) unpraktisch.


5
SHA-512 ist auch schnell, sodass Sie Tausende von Iterationen benötigen.
Seun Osewa

5
"Verwenden Sie keine schnellen Hash-Algorithmen ... langsamere Hashes sind besser" - Erklärung? Dokumentation?
one.beat.consumer

17
Erläuterung: Je schneller Sie Hashes erstellen können, desto schneller kann jeder Brute-Force-Prüfer arbeiten. Langsamere Hashes verlangsamen daher das brutale Forcen. Ein langsamer Hash-Algorithmus macht Brute Forcing für längere Passwörter (8 Stellen +) unpraktisch
NickG

6
Eher wie etwas wie bcrypt, das so konzipiert ist, dass es langsam hascht.
Fabian Nicollier

4
Wie in einer anderen Antwort erwähnt, "empfiehlt OWASP die Verwendung von Argon2 als erste Wahl für neue Anwendungen. Wenn dies nicht verfügbar ist, sollte stattdessen PBKDF2 oder scrypt verwendet werden. Wenn keine der oben genannten Optionen verfügbar ist, verwenden Sie bcrypt." Weder MD5 noch eine der SHA-Hashing-Funktionen sollten jemals für Hashing-Passwörter verwendet werden. Diese Antwort ist ein schlechter Rat.
Mike



25

Ich möchte einen Vorschlag hinzufügen, den ich verwendet habe, basierend auf der Tiefenverteidigung. Sie müssen nicht dasselbe Authentifizierungs- und Authentifizierungssystem für Administratoren haben wie normale Benutzer. Sie können ein separates Anmeldeformular für eine separate URL haben, die separaten Code für Anforderungen ausführt, die hohe Berechtigungen gewähren. Dieser kann Entscheidungen treffen, die für normale Benutzer ein totaler Schmerz wären. Eine solche, die ich verwendet habe, besteht darin, die Anmelde-URL für den Administratorzugriff zu verschlüsseln und dem Administrator die neue URL per E-Mail zu senden. Stoppt jeden Brute-Force-Angriff sofort, da Ihre neue URL beliebig schwierig sein kann (sehr lange zufällige Zeichenfolge), die einzige Unannehmlichkeit Ihres Administrators jedoch darin besteht, einem Link in seiner E-Mail zu folgen. Der Angreifer weiß nicht mehr, wohin er überhaupt posten soll.


Ein einfacher Link in einer E-Mail ist nicht wirklich sicher, da E-Mails nicht sicher sind.
David Spector

Es ist so sicher wie jedes andere tokenbasierte System zum Zurücksetzen von Passwörtern, das jedoch nicht aus zwei Faktoren besteht. Welches ist fast alle von ihnen.
Iain Duncan

17

Ich weiß nicht, ob es am besten war, dies als Antwort oder als Kommentar zu beantworten. Ich habe mich für die erste Option entschieden.

In Bezug auf das Poing TEIL IV: Vergessene Passwortfunktionalität in der ersten Antwort möchte ich auf Timing-Angriffe eingehen.

In den Formularen zum Speichern Ihres Kennworts kann ein Angreifer möglicherweise eine vollständige Liste der E-Mails überprüfen und feststellen, welche im System registriert sind (siehe Link unten).

In Bezug auf das Formular für vergessenes Passwort möchte ich hinzufügen, dass es eine gute Idee ist, die Zeiten zwischen erfolgreichen und nicht erfolgreichen Abfragen mit einer Verzögerungsfunktion gleichzusetzen.

https://crypto.stanford.edu/~dabo/papers/webtiming.pdf


14

Ich möchte einen sehr wichtigen Kommentar hinzufügen: -

  • „In einem Unternehmen, intra- net Einstellung,“ die meisten , wenn nicht alle der vorstehenden Ausführungen gelten möglicherweise nicht!

Viele Unternehmen stellen Websites nur für den internen Gebrauch bereit, bei denen es sich effektiv um "Unternehmensanwendungen" handelt, die zufällig über URLs implementiert wurden. Diese URLs können (angeblich ...) nur innerhalb des "internen Netzwerks des Unternehmens" aufgelöst werden. (Welches Netzwerk enthält auf magische Weise alle mit VPN verbundenen "Straßenkämpfer"?)

Wenn ein Benutzer pflichtbewusst mit dem oben genannten Netzwerk verbunden ist, ist seine Identität ("Authentifizierung") [bereits ...] "endgültig bekannt", ebenso wie seine Erlaubnis ("Autorisierung") , bestimmte Dinge zu tun ... wie z. .. "um auf diese Website zuzugreifen."

Dieser Dienst "Authentifizierung + Autorisierung" kann von verschiedenen Technologien bereitgestellt werden, z. B. LDAP (Microsoft OpenDirectory) oder Kerberos.

Aus Ihrer Sicht wissen Sie einfach Folgendes: Jeder, der legitimerweise auf Ihrer Website landet , muss von [einer Umgebungsvariablen, die auf magische Weise ...] ein "Token" enthält, begleitet werden. ( dh das Fehlen eines solchen Tokens muss ein unmittelbarer Grund dafür sein 404 Not Found.)

Der Wert des Tokens macht für Sie keinen Sinn, aber falls dies erforderlich sein sollte, gibt es "geeignete Mittel", mit denen Ihre Website "[autoritativ] jemanden fragen kann, der (LDAP ... usw.)" über alle (!) Frage, die Sie haben können. Mit anderen Worten, Sie nicht in Anspruch nehmen , sie von jeder „home-grown - Logik.“ Stattdessen erkundigen Sie sich bei der Behörde und vertrauen implizit ihrem Urteil.

Ähhh ... es ist ein ziemlicher mentaler Wechsel vom "wild-wolligen Internet".


9
Bist du als Kind gut in die Zeichensetzung gefallen? :) Ich habe es dreimal gelesen und bin immer noch verloren, an welchem ​​Punkt du versuchst zu machen. Wenn Sie jedoch sagen "Manchmal benötigen Sie keine formularbasierte Authentifizierung", haben Sie Recht. Aber wenn man bedenkt, dass wir diskutieren, wann wir es brauchen, verstehe ich nicht, warum dies sehr wichtig ist?
Hugo Delsing

1
Mein Punkt ist, dass die Welt außerhalb eines Unternehmens völlig anders ist als die Welt innerhalb. Wenn Sie eine App erstellen, die für das "Wooly Wide Web" zugänglich ist und für die Öffentlichkeit allgemein zugänglich ist, haben Sie keine andere Wahl, als Ihre eigenen Authentifizierungs- und Autorisierungsmethoden zu verwenden. In einem Unternehmen, in dem die einzige Möglichkeit, dorthin zu gelangen, darin besteht, dort zu sein oder VPN zu verwenden, ist es sehr wahrscheinlich, dass die Anwendung nicht über "eigene" Methoden verfügt, um diese Dinge zu tun. Die App muss stattdessen diese Methoden verwenden, um eine konsistente, zentralisierte Verwaltung bereitzustellen.
Mike Robinson

2
Selbst Intranets erfordern ein Mindestmaß an Sicherheit im Gebäude. Der Vertrieb hat vertrauliche Gewinn- und Verlustzahlen, während das Engineering vertrauliches geistiges Eigentum hat. Viele Unternehmen beschränken Daten über Abteilungs- oder Abteilungsgrenzen hinweg.
Sablefoste

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.