Wenn Ihr Webhost dies zulässt oder Sie mit vertraulichen Daten umgehen müssen, verwenden Sie HTTPS, Punkt. (Es wird oft vom Gesetz afaik vorgeschrieben).
Andernfalls, wenn Sie etwas über HTTP tun möchten. Ich würde so etwas tun.
- Der Server bettet seinen öffentlichen Schlüssel in die Anmeldeseite ein.
- Der Client füllt das Anmeldeformular aus und klickt auf Senden.
- Eine AJAX-Anforderung erhält den aktuellen Zeitstempel vom Server.
- Das clientseitige Skript verkettet die Anmeldeinformationen, den Zeitstempel und ein Salt (gehasht aus analogen Daten, z. B. Mausbewegungen, Tastendruckereignisse) und verschlüsselt sie mit der öffentlichen Taste.
- Sendet den resultierenden Hash.
- Der Server entschlüsselt den Hash
- Überprüft, ob der Zeitstempel aktuell genug ist (erlaubt nur ein kurzes Fenster von 5 bis 10 Sekunden). Lehnt die Anmeldung ab, wenn der Zeitstempel zu alt ist.
- Speichert den Hash 20 Sekunden lang. Lehnt denselben Hash für die Anmeldung während dieses Intervalls ab.
- Authentifiziert den Benutzer.
Auf diese Weise ist das Kennwort geschützt und der gleiche Authentifizierungs-Hash kann nicht wiedergegeben werden.
Informationen zur Sicherheit des Sitzungstokens. Das ist etwas schwieriger. Es ist jedoch möglich, die Wiederverwendung eines gestohlenen Sitzungstokens etwas zu erschweren.
- Der Server setzt ein zusätzliches Sitzungscookie, das eine zufällige Zeichenfolge enthält.
- Der Browser sendet dieses Cookie bei der nächsten Anfrage zurück.
- Der Server überprüft den Wert im Cookie. Wenn er anders ist, wird die Sitzung zerstört, andernfalls ist alles in Ordnung.
- Der Server setzt das Cookie erneut mit einem anderen Text.
Wenn also das Sitzungstoken gestohlen wurde und eine Anfrage von einer anderen Person gesendet wird, wird die Sitzung bei der nächsten Anfrage des ursprünglichen Benutzers zerstört. Wenn der Benutzer also aktiv auf der Website surft und häufig auf Links klickt, kommt der Dieb mit dem gestohlenen Token nicht weit. Dieses Schema kann verstärkt werden, indem eine andere Authentifizierung für die vertraulichen Vorgänge erforderlich ist (z. B. Löschen eines Kontos).
BEARBEITEN: Bitte beachten Sie, dass dies MITM-Angriffe nicht verhindert, wenn der Angreifer eine eigene Seite mit einem anderen öffentlichen Schlüssel und Proxy-Anforderungen an den Server erstellt. Um sich davor zu schützen, muss der öffentliche Schlüssel im lokalen Speicher des Browsers oder in der App fixiert sein, um diese Art von Tricks zu erkennen.
Über die Implementierung: RSA ist wahrscheinlich der bekannteste Algorithmus, aber für lange Schlüssel ist es ziemlich langsam. Ich weiß nicht, wie schnell eine PHP- oder Javascript-Implementierung sein würde. Aber wahrscheinlich gibt es schnellere Algorithmen.