Immer und immer wieder wird das JS-SHA-Login Verfahren in Frage gestellt:

  • Wozu, wenn es eh nicht 100% Sicher ist?
  • Alles außer https ist nutzlos
  • Funktioniert ja nur mit JavaScript, das hab ich nicht.

Natürlich ist es richtig, nur https bietet die sicherste Lösung. Allerdings sollten man auch wissen: Unsignierte dummy-Zertifikate, die ohne Zertifizierungsverfahren selbst erstellt wurden, sind verwundbar für einen Man-In-The-Middle-Angriff.

Jedoch ist es nun einmal so, das man nicht immer secure http zur Verfügung hat. Weil es z.B. nicht umsonst gibt, bzw. nicht für wenig Geld.
Was also tun? Es so machen wie alle anderen und Passwörter dann einfach im Klartext durch das Internet schicken???

Ich bin der Meinung es ist besser etwas für die Sicherheit zu tun als überhaupt nichts!

Wenn Passwörter im Klartext durchs Internet wandern, kann man diese recht einfach und ohne viel Aufwand abfangen. Ist es dann noch eine gute Idee, sich von der Uni ein zu loggen?
Hinzu kommt das Problem, das viele Leute das selbe Passwörter auf verschiedenen Seiten nutzten. Wenn also das Passwort dann auch bei eBay, Amazon und Co. funktionieren, hat man ein Problem. (Abgesehen davon, sollte man auch mit https auf jeder Seite ein anderes Passwort nutzten!)

Natürlich funktioniert der JS-SHA-Login nur mit JavaScript. Ohne geht es einfach nicht. Wie soll man sonst auf dem Client das Klartextpasswort verarbeitet können? Dies ist allerdings zwingend notwendig. Ohne JavaScript kann man den normalen Plaintext Login von Django nutzten.

Klar ist: Das JS-SHA-Login Verfahren verhindert es, das ein Passwort in Klartext übermittelt wird. Es ist auch nicht so, das einfach nur eine SHA Hash vom Passwort übermittelt wird. Das gesamte Verfahren ist ein wenig Komplizierter. Der Detailtiere JS-SHA1-Login Ablauf zeigt das recht einfach.

Es ist sichergestellt, das ein Angreifer mit den Übermittelten Login Daten nicht auf das Passwort Rückschließen kann. Außerdem ist sichergestellt, das die auf dem Server hinterlegten Daten nicht einfach für einen Login genutzt werden können. Es bietet ebenfalls keinen direkten Rückschluss auf das User-Passwort. Somit hat ein SQL-Dump, in den Fingern eines bösen Buben, auch nicht viel Wert!

Als Alternative kommt Digest access authentication in Frage. Mit django-digest existiert auch eine Implementierung in django. Wer will kann die App zusätzlich installieren und nutzten. Diese Lösung kommt dann auch ohne JavaScript aus, weil die Browser es direkt unterstützten.
Das Problem ist allerdings, das auf dem Server zumindest der HA1 gespeichert werden muss. Das Problem: Alleine mit dem HA1 kann man sich einloggen, denn: HA1 = MD5(username:realm:password). Somit darf man z.B. einen SQL Dump nicht mehr aus den Fingern geben.

Und zum Schluss: Eine Absolute Sicherheit gibt es wohl nicht und wird es wohl auch nie geben ;)