Sonntag, 9. März 2008

Idee: Sicherer LogIn via PHP/JavaScript

Für die Benutzeranmeldung bei einem Web-Service wird das Passwort zwar in aller Regel verschlüsselt gespeichert und übertragen, jedoch wird immer die selbe Zeichenfolge übertragen, wodurch das Passwort prinzipiell nicht vor Man-In-The-Middle angriffen geschützt ist.
Mit einem einfachen Trick lässt sich diese Problematik verhindern: Beim ersten von zwei LogIn Schritten wird vom Anwender der Benutzername eingegeben und zusammen mit der lokalen Systemzeit an den Server übertragen. Der Server speichert die Serverzeit der Anfrage, sowie die Abweichung der Serverzeit von der lokalen Zeit des Clients und sendet die Serverzeit zurück an den Anwender. Der Anwender gibt nun sein Passwort ein, aus dem mit Hilfe der erhaltenen Serverzeit lokal ein One-Time-Code erstellt wird. One-Time-Code, lokale Zeit und Benutzername werden nun an den Server gesendet. Der Server prüft, ob die Abweichung von Serverzeit und lokaler Zeit in etwa derjenigen bei Bereitstellung der Serverzeit entspricht, und ob seit deren Bereitstellung weniger als 2 Minuten vergangen sind. Ist dies der Fall, ermittelt der Server ebenfalls aus dem gespeicherten Passwort des Benutzers und der gespeicherten Serverzeit einen One-Time-Code. Stimmt dieser mit dem vom Anwender erhaltenen Code überein, wird der LogIn gewährleistet.
Da der beim nächsten LogIn verwendete Code völlig anders ist, und sich die Serverzeit nie wiederholen wird, ist das Abhören des One-Time-Codes absolut nutzlos.
Nachteil dieser leicht implementierbaren Methode ist, dass zum LogIn zwei Schritte benötigt werden, sofern keine Technik wie AJAX eingesetzt wird, die die Serverzeit im Hintergrund anfordert.
Eine einfache Implementierung werde ich demnächst bereitstellen.