it-swarm-eu.dev

Kann jemand Referenzen für die ordnungsgemäße Implementierung von Mechanismen zum Zurücksetzen von Selbstkennwörtern für Webanwendungen bereitstellen?

Wir implementieren das Zurücksetzen des Selbstkennworts in einer Webanwendung und ich weiß, wie ich dies tun möchte (zeitlich begrenzte URL zum Zurücksetzen des Kennworts per E-Mail an die vorregistrierte E-Mail-Adresse des Benutzers).

Mein Problem ist, dass ich keine Referenzen finden kann, die die Entwickler auf diese Technik hinweisen. Kann mich jemand auf einige gute Referenzen zu dieser Technik hinweisen?

96
bdg

Einige Vorschläge:

Setzen Sie das Passwort des Benutzers erst zurück, wenn es bestätigt wurde. Setzen Sie das Passwort des Benutzers nicht sofort zurück. Setzen Sie es erst zurück, wenn der Benutzer auf einen Bestätigungslink klickt, der an seine vorregistrierte E-Mail-Adresse gesendet wurde.

CAPTCHA erforderlich. Wenn ein Benutzer das Zurücksetzen seines Kennworts anfordert, zwingen Sie ihn, ein CAPTCHA zu lösen, bevor Sie fortfahren. Dies soll verhindern, dass automatisierte Tools versuchen, vielen Benutzern Kummer zu bereiten, und den Benutzer dazu zwingen, zu beweisen, dass sie ein Mensch (kein Roboter) sind.

Zufälligkeit. Die zeitlich begrenzte URL zum Zurücksetzen des Passworts sollte eine zufällige, nicht erratbare Komponente enthalten. Stellen Sie sicher, dass Sie Zufälligkeit in Kryptoqualität verwenden. Die Ausgabe von /dev/urandom Oder System.Security.Cryptography.RNGCryptoServiceProvider Wäre eine gute Wahl. Die Ausgabe von Rand() oder random() oder System.Random Ist nicht zufällig genug und wäre eine schlechte Wahl. A GUID oder Zeitstempel ist nicht zufällig genug und wäre keine gute Wahl.

Geben Sie ein Zeitlimit an. Der Link zum Zurücksetzen der Bestätigung sollte nach einer angemessenen Zeit ablaufen: z. B. 24 Stunden. Der Link sollte nur einmal verwendbar sein und sofort ablaufen, sobald er verwendet wird.

Fügen Sie der E-Mail einen erläuternden Text hinzu. Möglicherweise möchten Sie der E-Mail einen erläuternden Text hinzufügen, um zu erklären, warum die E-Mail gesendet wurde, falls jemand eine anfordert Zurücksetzen für ein Konto, das nicht Ihr eigenes ist. Sie könnten einen Text wie "Jemand hat angefordert, dass das Passwort für Ihr Konto zurückgesetzt wird username auf site einfügen. Wenn Sie diese Anfrage gestellt haben, klicken Sie hier, um Ihr Passwort zu ändern. Wenn Sie dies nicht getan haben Klicken Sie hier, um die Anfrage abzubrechen. "

E-Mail senden, nachdem das Passwort zurückgesetzt wurde. Wenn das Passwort erfolgreich zurückgesetzt wurde, senden Sie eine E-Mail an den Benutzer, um ihn darüber zu informieren, dass das Passwort geändert wurde. Fügen Sie das neue Passwort nicht in diese E-Mail ein.

Stornierungen überwachen. Sie können eine Logik in Betracht ziehen, um die Häufigkeit zu überwachen, mit der Benutzer auf den Stornierungslink klicken, um anzuzeigen, dass sie keinen Reset angefordert haben. Wenn dies einen bestimmten Schwellenwert überschreitet, kann es nützlich sein, eine Warnung an die Systembetreiber zu senden. Wenn ein Stornierungslink für eine Anfrage besucht wird nach der Bestätigungslink besucht wird, ist dies ein möglicher Hinweis auf einen Angriff gegen diesen Benutzer. Möglicherweise möchten Sie an diesem Punkt Maßnahmen ergreifen, z , das Kennwort des Benutzers ungültig machen und ihn auffordern, sein Kennwort erneut zurückzusetzen. (Dies ist eine Verteidigung gegen den folgenden Angriff: Der Angreifer erhält Zugriff auf das Postfach des Benutzers, fordert das Zurücksetzen seines Kennworts auf Ihrer Site an und besucht dann den Bestätigungslink. Wenn der Angreifer diese E-Mails nicht aus dem Posteingang des Benutzers löscht, Wenn der echte Benutzer dann seine E-Mail liest, kann er auf den Stornierungslink klicken und Ihnen einen Hinweis auf mögliche Probleme geben.)

Verwenden Sie HTTPS. Der Link sollte https (nicht http :) verwenden, um sich vor verschiedenen Angriffen zu schützen (z. B. Firesheep-Angriffe auf Benutzer, die über das Internet im Internet surfen Cafe).

Protokollieren Sie diese Vorgänge. Ich schlage vor, alle derartigen Anforderungen zu protokollieren. Zusätzlich zur Protokollierung des Benutzernamens des Benutzers möchten Sie möglicherweise die IP-Adresse des Clients protokollieren, der eine E-Mail an den Benutzer per E-Mail an den Benutzer gesendet hat, sowie die IP-Adresse des Clients, der den Rücksetzlink besucht hat.

Zusätzliche Lektüre. Vielleicht möchten Sie auch Troy Hunts hervorragenden Blog-Beitrag lesen. Alles, was Sie schon immer über das Erstellen einer sicheren Funktion zum Zurücksetzen von Passwörtern wissen wollten . Vielen Dank an @coryT für einen Link zu dieser Ressource.

Schließlich sollten Sie die Authentifizierung ohne Kennwort in Betracht ziehen. Kennwörter haben als Authentifizierungsmechanismus viele Probleme, und Sie können andere Methoden zur Authentifizierung von Benutzern in Betracht ziehen, z. B. das Speichern einer sicheren Authentifizierung hartnäckiger Cookie auf ihrem Computer mit einem nicht zu erratenden Geheimnis, um sie zu authentifizieren. Auf diese Weise gibt es kein Passwort zum Vergessen und keine Möglichkeit für den Benutzer, Phishing zu betreiben. Sie müssen jedoch eine Möglichkeit für einen Benutzer bereitstellen, den Zugriff von einem neuen Computer oder einem neuen Browser aus zu autorisieren (möglicherweise per E-Mail an den Benutzer vorab) registrierte Emailadresse). Dieses Umfragepapier bietet eine hervorragende Übersicht über viele Fallback-Authentifizierungsmethoden und ihre Stärken und Schwächen.

93
D.W.
15
coryT

Jeder Ort, an dem Sie ein Passwort erhalten können, bedeutet, dass das Passwort nicht gehasht, sondern dort gespeichert wird, wo es für "Klartext" entschlüsselt werden kann. Das an sich ist schlecht.

Wahrscheinlich nicht "am sichersten", aber sicherer wäre:

Senden Sie auf Anforderung eines Kennworts einen Link zum Zurücksetzen des Kennworts an den Benutzer mit eingebetteter GUID. Die Sitzung in der GUID läuft in, hmm, Stunde oder so ab.

9
Rich Homolka

OK, Ihre Frage ist also, wie Sie den Prozess zur Wiederherstellung von Kennwörtern/Konten strukturieren sollten. Dies hängt davon ab, wofür Sie optimieren möchten: problemlose Benutzererfahrung oder gute Sicherheit.

Wenn Sie gute Sicherheit wünschen:

  • Während der Anmeldung muss der Benutzer seine E-Mail-Adresse eingeben.
  • Während der Anmeldung muss der Benutzer einen sekundären Kanal zur Authentifizierung eingeben - Mobiltelefonnummer oder Frage & Antwort herausfordern (d. H. " wie lautet der Mädchenname Ihrer Mutter " oder besser).

  • Während der Wiederherstellung erhält Ihr System zunächst eine grobe Überprüfung der Identität mithilfe des oben genannten sekundären Kanals - der Herausforderungsfrage oder durch SMS-Code an das Mobiltelefon oder ähnliches.

  • Wenn die erste oben genannte Identitätsprüfung gelöscht ist, sendet das System eine E-Mail zum Zurücksetzen des Kennworts nur an die zuvor eingegebene E-Mail-Adresse. Dies ist eine zusätzliche wichtige Maßnahme, um f.x. Exploits vom Typ Sarah Palin .

  • Die E-Mail darf nicht enthält ein neues Passwort oder ähnliches. Es sollte einen anklickbaren Link zu einer HTTPS-verschlüsselten Webseite auf Ihrer Website enthalten, die a) über einen nicht erratenen geheimen Wert in der URL b ) ist zeitlich begrenzt, sodass die Kontowiederherstellung nur x Stunden nach der Anforderung funktioniert. c) bietet dem Endbenutzer die Möglichkeit, ein neu Passwort.

  • Haben Sie eine gute Protokollierung bei allen Transaktionen zum Zurücksetzen des Kontos und lassen Sie diese von einem Menschen tatsächlich überwachen und handeln, wenn sie verdächtig erscheinen (überprüfen Sie die Serverprotokolle auf die IP-Adressen fx, kommen viele Anfragen von derselben IP-Adresse, gibt es Instanzen, bei denen a Der Benutzer versucht, Kennwörter aus einem anderen Land als dem des registrierten Kontoinhabers usw. zurückzusetzen.

Sie können diese Komplexität auch ganz umgehen: Es ist noch früh, aber OAuth/OpenID/über Facebook anmelden, Google usw. entfernt diese Komplexität vollständig von Ihren Systemen, jedoch mit einem möglicherweise weniger gut etablierte Benutzerfreundlichkeit .

9
Jesper M

Der sicherste Weg, um ein Zurücksetzen des Kennworts durchzuführen, besteht darin, ein großes zufälliges eindeutiges einmaliges Zurücksetzen-Token mit einem an die Benutzer-ID gebundenen Ablaufdatum zu generieren. Das Token sollte in der Datenbank gehasht werden, da ein Angreifer mit SQL-Zugriff damit beliebige Benutzerkennwörter zurücksetzen kann.

Ein Reset-Link sollte an die E-Mail-Adresse gesendet werden, die das Reset-Token enthält. Wenn der Benutzer auf den Link klickt, sollte der Hash des Tokens in der Datenbank gefunden und das Ablaufdatum für die Zukunft überprüft werden. Wenn diese Bedingungen erfüllt sind, sollte dem Benutzer ein Bildschirm angezeigt werden, auf dem er ein neues Kennwort eingeben kann.

Dieser gesamte Vorgang muss über SSL erfolgen, andernfalls kann ein Angreifer die URL abhören und das Kennwort zurücksetzen, bevor der Benutzer dies tut.

Ein paar andere Tipps:

  1. Geheime Fragen sind ein kleiner Ärger für Angreifer und ein großer Ärger für Benutzer. Vermeiden Sie sie vollständig.
  2. Stellen Sie dem Benutzer eine Herausforderung zur Überprüfung durch den Menschen (z. B. ein CAPTCHA) vor, bevor Sie das Zurücksetzen des Kennworts senden. Dies verhindert automatische Rücksetzanforderungen.
  3. Überprüfen Sie, ob die IP-Adresse, die den Reset durchführt, zuvor erfolgreich beim Konto angemeldet wurde. Wenn dies nicht der Fall ist, fragen Sie nach weiteren Details zum Konto/Benutzer, z. Kontoerstellungsjahr, Geburtsdatum, erste Adresszeile.
  4. Fügen Sie den Link "Ich habe nicht nach dieser E-Mail gefragt" hinzu, damit Benutzer fehlerhafte Anforderungen zum Zurücksetzen des Kennworts melden können.
6
Polynomial

Eine andere Möglichkeit, die für Ihre Anwendung geeignet sein kann oder nicht, aber in Online-Banking-Anwendungen und ähnlichen Anwendungen verwendet wird, besteht darin, die Hälfte des Rücksetzcodes per SMS Messaging an ein registriertes Mobiltelefon) zu senden. Aus der Sicht eines Angreifers ist dies eine vollständige PITA, da ein Kompromiss zwischen einigen Kanälen erforderlich ist, um zu brechen.

6
Rory Alsop

2-Faktor-Authentifizierung über SMS! 1 Sie kennen den Kunden und seine Handynummer, SMS ihnen einen eindeutigen Code, den Sie zur Website hinzufügen müssen, um ihn zu validieren: )

0
frank

Machen Sie ein paar Schritte. Zum Beispiel so etwas:

  1. Benutzer vergisst sein Passwort. Er klickt auf die Schaltfläche "Ich habe mein Passwort vergessen, sende mir eine E-Mail, was als nächstes zu tun ist" (die Beschriftung der Schaltflächen kann abweichen;))
  2. Ihr Server sendet ihm einen Link www.yourdomain.com/lostpassword?param_1=x;param_2=y
  3. Er klickt auf den Link und kann sich ein neues Passwort erstellen
  4. Er klickt auf Senden. Alles erledigt. Alle glücklich

Einziger Fang ist in Punkt 3). X- und Y-Werte sollten zufällig, unvorhersehbar und mit diesem einen bestimmten Konto verbunden sein. Sie sollten auch nur einmal verwendet werden und nach kurzer Zeit (24 Stunden?) Veraltet sein. Speichern Sie beide Werte in einer dedizierten Tabelle mit den entsprechenden Spalten:

| some_id | user_id | X | Y | expire_time

Wenn ein Benutzer versucht, den richtigen Link zu verwenden, prüfen Sie, ob die Ablaufzeit nicht eingehalten wird, und erlauben Sie ihm, das Kennwort zu ändern, wenn dies nicht der Fall ist.

0
Andrzej Bobak