Deswegen macht IMHO django-secure-js-login Sinn...
Klar, im idealfall hat man secure-http und ein Beglaubichtes Zertifikat und alles gut...
Aber wie sieht es in der Praxis aus? Meist doch kein HTTPS und normaler Klartext-Passwort-Login... z.B. hier im Forum
Wobei IMHO fast in allen anderen Foren/Wikis, bei denen ich mich so rumtreibe...
Weil?
Eigenes Zertifikat -> Erstmal Browser Fehlermeldung
Kostenloses beglaubigtes Zertifikat -> zu kompliziert im beantragen / Server Setup
Zertifikat direkt vom Server-Betreiber -> zu teuer
SSL-Proxy -> günstig, aber auch nicht wirklich Sucher und doofer Domain-Name
Dazu kommt, das die ganze SSL/Zertifikat Geschichte eh nicht mehr so ganz das Wahre ist, siehe:
http://www.heise.de/thema/SSL
Es gab doch mal so ein "Open Source" Projekt, die das ganze Zertifikat-Kram vereinfachen sollte... Finde es allerdings nicht mehr...
DasIch hat geschrieben:Das Problem mit == ist dass die Zeit in der der Vergleich ausgeführt wird abhängig ist von der Länge des gemeinsamen Präfixes. Wenn man so ein geheimes mit einem vom User beeinflussten Argument vergleicht, kann der User anhand der vergangenen Zeit Rückschlüsse auf das geheime Argument ziehen. Deswegen ist auch dein ganzes logging problematisch, je nachdem wo du damit Zeit "verschwendest" kann ein Angreifer möglicherweise Rückschlüsse darauf ziehen wie weit er gekommen ist.
Dazu hatte ich mir nochmal Gedanken gemacht:
Klar, man kann alles so gestalten, das eine Überprüfung theoretisch immer die selbe Zeit dauert...
Ich hatte jetzt aber mehr den Ansatz, möglichst wenig CPU Zeit zu verschwenden. Also so früh wie möglich die weitere Überprüfung abbrechen...
Wie wäre es mit der Lösung:
Wenn das Passwort falsch ist, dann:
time.sleep(random.uniform(0, 0.5))
Vorteil:
* Kein Rückschluss auf "wie weit bin ich gekommen" möglich
* keine CPU Verschwendung in Multi-Threading-Umgebung