django-secure-js-login

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Ich habe schon vor Jahren eine für beide Seiten 100% sichere Authentifizierung auf Basis von PAK geschrieben. Nebenbei fällt auch noch ein Session-Key ab, der für die weitere Verschlüsselte Kommunikation verwendet werden kann. Einzige Schwachstelle ist, dass der JavaScript Code natürlich manipuliert werden kann.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

DasIch hat geschrieben:Side-channel attacks über timing funktioniert durch aus auch über Netzwerke oder sogar das Internet. Das ist nicht ganz trivial aber durchaus praktikabel. Zufällig warten hilft da übrigens überhaupt nicht.
Warum?!?
DasIch hat geschrieben:Ein Zertifikat kann man übrigens problemlos kostenlos von StartSSL bekommen.
StartSSL hatte ich mal Probiert. War mir ehrlich gesagt viel zu kompliziert.

Man muß halt abwägen. Für was man es einsetzt...

Hatte ich schon erwähnt, das hier im Forum ebenfalls keine Verschlüsselung aktiv ist... Stimmt nicht: https://www.python-forum.de/ aber:
www.python-forum.de verwendet ein ungültiges Sicherheitszertifikat.

Das Zertifikat gilt nur für vst-opdm.de.
Warum wohl? Ich vermute mal, es ist zu Aufwendig...
DasIch hat geschrieben:Dieser JS Login ist nette obfuscation mehr aber auch nicht, vor allem ist es nach keiner brauchbaren Definition "secure".
Es ist kein "obfuscation" im Sinne von "Verschleierung"...

Also Angriffssektor sehe ich eigentlich nur eine Man-In-The-Middle Attacke... Die ist natürlich in der Praxis anzutreffen, aber sicherlich nicht mal eben so machbar. Außerdem, wer macht sich schon die Mühe dazu, für eine Private Homepage?!? Da sehe ich den Haupteinsatzzweck.
Sirius3 hat geschrieben:Ich habe schon vor Jahren eine für beide Seiten 100% sichere Authentifizierung auf Basis von PAK geschrieben.
Sourcen noch da?!?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Nu auch hier:
Bild - https://coveralls.io/r/jedie/django-secure-js-login

und nun auch alles ok:
Bild - https://travis-ci.org/jedie/django-secure-js-login/



TODO: Mehr Tests mit Ausnahmen/Falschen Daten...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ich habe das Thema "DOS potenzial in django.contrib.auth ?!?" abgetrennt: http://www.python-forum.de/viewtopic.php?f=7&t=36279

Sowie ein separates Thema "login timing attacks..." eröffnet: http://www.python-forum.de/viewtopic.php?f=7&t=36282


In django-secure-js-login gibt es auch einige Neuerungen:
* Den ganzen Validierungs-Prozess habe ich überarbeitet
* Über "Signals" halte ich den Grund eines Fehlgeschlagenen Login "fest"
* Bei settings.DEBUG sieht man den Fehlergrund beim Login selbst
* Bei settings.DEBUG=False: sieht man immer nur die selbe, allgemeine Fehlermeldung.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Hab die README erweitert, damit man auch weiß, wie man die app bei sich einbinden kann:

https://github.com/jedie/django-secure-js-login#usage

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

jens hat geschrieben:
DasIch hat geschrieben:Ein Zertifikat kann man übrigens problemlos kostenlos von StartSSL bekommen.
StartSSL hatte ich mal Probiert. War mir ehrlich gesagt viel zu kompliziert.

Man muß halt abwägen. Für was man es einsetzt...

[…]
www.python-forum.de verwendet ein ungültiges Sicherheitszertifikat.

Das Zertifikat gilt nur für vst-opdm.de.
Warum wohl? Ich vermute mal, es ist zu Aufwendig...
Gibt hier eine schrittweise, bebilderte Erklärung, wie man bei StartSSL ein Zertifikat bekommt: https://github.com/ioerror/duraconf/blo ... E.markdown
Ohne SSL kannst Du keine sichere Passwort-Übertragung machen. Das liegt daran, dass das JavaScript von einem Angreifer ausgetauscht werden kann.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Oh, netter Link. Danke!

btw. vielleicht wird es ja auch mit https://letsencrypt.org/ besser... Soll ja ganz einfach werden...


Ach, ich baue gerade eine 2-Faktor-Authentifizierung mittels TOTP ein ;)


EDIT: https://github.com/jedie/django-secure- ... two-factor :lol:

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Die zwei Faktor Authentifizierung läuft rudimentär ;)

Mir ist aufgefallen, das dies auch eine beträchtliche Steigerung der Sicherheit ist. Denn damit wird ein man in the middle Angriff entschärft. Ein MITM kann zwar den JS code tauschen und so das Klartext Passwort erhalten, aber nicht das 2-Faktor Geheimnis!
Muss allerdings noch sicherstellen, das man es nicht einfach im Admin anzeigen lassen kann ;)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:


GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

jens hat geschrieben:Interessanter blog post: http://tonyarcieri.com/whats-wrong-with-webcrypto
Wie dem auch sein... Ich denke es macht Sinn window.crypto zu nutzten, anstatt JS Implementierungen mit zu schleppen. Zumal wahrscheinlich die Browser Implementierungen viel schneller sein dürften.

Allerdings gibt es zig varianten, siehe: https://diafygi.github.io/webcrypto-examples/

Muß mal sehen, welche von den meisten Browsern unterstützt wird.

Deswegen -> https://github.com/jedie/django-secure- ... n/issues/5

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Der Artikel kritisiert ja auch nicht die Nutzung von window.crypto sondern dass Design. Selbst wenn du willst kannst du es nicht wirklich nutzen weil jeder Browser machen kann was er will und du nicht darauf vertrauen kannst dass bereitgestellt wird was du brauchst.

Dazu kommt natürlich das Crypto im Client grundsätzlich fragwürdig ist. Wenn du keine HTTPS Verbindung hast ist es sinnlos und ansonsten kannst du es mindestens genauso gut und in der Regel besser auf dem Server machen.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

jens hat geschrieben:Muß mal sehen, welche von den meisten Browsern unterstützt wird.
Bei http://blog.engelke.com/ hat sich Charles Engelke die Arbeit gemacht und die Test Seite https://diafygi.github.io/webcrypto-examples/ mit verschiedenen Browsern zu testen.

Ergebnis ist diese Tabelle: https://docs.google.com/spreadsheets/d/ ... A0/pubhtml

Demnach funktioniert überall diese Varianten:
  • RSASSA-PKCS1-v1_5 - 1024, 2048, 4096
  • RSA-OAEP - 1024, 2048, 4096
  • AES-CBC - 128 und 256 bit
  • AES-GCM - 128 und 256 bit
  • AES-KW - 128 und 256 bit
  • HMAC
  • SHA 1, 256, 385 und 512
So auch das "Fazit" aus dem Blog post http://blog.engelke.com/2015/03/06/wher ... api-today/ :
RSA-PKCS1-v1_5 for digital signatures
RSA-OAEP for public key encryption
AES-CBC and AES-GCM for symmetric encryption
HMAC, and SHA-1 and SHA-2 hash functions are pretty much universally supported.
1024, 2048 or 4096 bit keys for the public key algorithms
128 and 256 bit keys for symmetric encryption safely
Leider läuft PBKDF2 nicht überall.

Demnach würde sich ja HMAC mit SHA-512 anbieten, was?
DasIch hat geschrieben:Wenn du keine HTTPS Verbindung hast ist es sinnlos und ansonsten kannst du es mindestens genauso gut und in der Regel besser auf dem Server machen.
Das ist die alte Argumentations-Schleife, neu gestartet...
Meine Antwort ist: Besser das Passwort verschlüsselt übertragen, statt im Plain-Text. Gerade wenn man kein HTTPS hat und wenn doch, kann es auch nicht schaden...

EDIT:
DasIch hat geschrieben:kannst du es mindestens genauso gut und in der Regel besser auf dem Server machen.
Ich hab mir zwischenzeitlich auch überlegt, das ich auf dem Server zusätzlich das normale PBKDF2 mache... Also so wie es Django beim normalen Password auch speichert... Mal sehen...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

jens hat geschrieben:Demnach würde sich ja HMAC mit SHA-512 anbieten, was?
Für irgendwas bietet sich das vielleicht an aber nicht um Paswörter zu hashen. PBKDF2, bcrypt oder scrypt sollten es schon sein, zumindest bis zum Herbst/Winter, wenn Argon2 fertig ist.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittlerweile hab ich mir auch so überlegt, bei PBKDF2 zu bleiben. Das nutzte ich ja eh schon...

Leider schließt man aktuell damit ein paar Browser/OS Kombinationen aus :(


Laut der Tabelle https://docs.google.com/spreadsheets/d/ ... A0/pubhtml kommt eigentlich nur Firefox unter Linux/Windows/OSX/Android damit aus.

Bei https://www.chromium.org/blink/webcrypto steht zwar eigentlich das Chromium es können sollte. Aber zumindest v43.0.2357.130 auf Ubuntu 14.04/LinuxMint 17 (64-bit) geht es schon mal nicht. (EDIT: Ach im kleingedrucken unten drunter steht ja auch: algorithm is not supported on platforms using NSS for their crypto (Linux and ChromeOS). This will be solved in future versions of Chrome once bug 338883 is addressed.)

Internet Explorer 11 geht wohl auch nicht, nach https://msdn.microsoft.com/en-us/librar ... 85%29.aspx zu urteilen. Wie es mit dem neuen "Microsoft Edge" Browser aussieht, konnte ich nicht herausfinden.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mit https://github.com/jedie/django-secure- ... 58f1b3510c läuft der Login via WebCrypt.

Nun kann ich die iterations hochsetzten... Aber auf welchen Wert?

EDIT: Schade ist, die Selenium tests laufen lokal bei mir, aber nicht auf TravisCI: https://travis-ci.org/jedie/django-secu ... s/72628593
Vermutlich ist der Firefox 31.0esr zu alt?!? (Die neuste ESR ist 38 und nicht 31)

Leider steht bei https://developer.mozilla.org/en-US/doc ... dow/crypto keine genaue Versionsnummer...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Hab nochmal kurz https://diafygi.github.io/webcrypto-examples/ unter windows getestet:

Firefox v31.8.0esr kann nichts, erst mit v38.1.0esr wird es was...

IE 11 macht nichts, weil die Seite ".then()" verwendet, welches der IE nicht beherrscht, siehe auch: https://developer.mozilla.org/de/docs/W ... omise/then

Evtl. kann https://github.com/taylorhakes/promise-polyfill da weiter helfen... Ich hab es lokal mal versucht, bringt aber nix.

EDIT: Hab es mal gemeldet: https://github.com/diafygi/webcrypto-examples/issues/12

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

So, mit https://github.com/jedie/django-secure- ... b4eba82873 laufen auch die unittests auf TravisCI.
Ich mußte dazu nur noch einen wait einfügen ;)

Getestet wird nun mit Firefox Firefox v38.0esr

Bild - https://travis-ci.org/jedie/django-secu ... s/72680308


EDIT: WebCrypto PBKDF2 test .html und .py datei: https://gist.github.com/jedie/14f5b342ac44418368f9

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

So, erste "alpha" version ist draußen:

https://pypi.python.org/pypi/django-sec ... ogin/0.3a0

WebCrypto branch und "two-factor" branch (Time-based One-time Password) sind nun in master...


Lokales ausprobieren ist recht einfach:

Code: Alles auswählen

~ $ virtualenv secure-js-login-env
~ $ cd secure-js-login-env
~/secure-js-login-env $ source bin/activate

(secure-js-login-env)~/secure-js-login-env $ pip install -e git+https://github.com/jedie/django-secure-js-login.git#egg=django-secure-js-login

(secure-js-login-env)~/secure-js-login-env $ cd src/django-secure-js-login/
(secure-js-login-env)~/secure-js-login-env/src/django-secure-js-login $ ./run_example_server.sh
s.a.: https://github.com/jedie/django-secure-js-login#tryout

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Nochmal dazu, welcher Browser alles "PBKDF2" kann...

Es gibt die Seite: http://caniuse.com/#feat=cryptography allerdings ist es dort leider nur pauschal von WebCrypto die rede. Doch so enfach ist das ja nicht, wie https://github.com/diafygi/webcrypto-examples/ es ja aufzeigt...

Hab mal Windows 10 build 10162 in einer VM installiert und den neuen Browser Edge v20.10162.0.0 getestet.
Der kann zwar schon ein paar Sachen, aber "PBKDF2" nicht :(

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

jens hat geschrieben:Hab mal Windows 10 build 10162 in einer VM installiert und den neuen Browser Edge v20.10162.0.0 getestet.
Der kann zwar schon ein paar Sachen, aber "PBKDF2" nicht :(
Genauso sieht es wohl in der Apfel welt aus: https://github.com/jedie/WebCrypto-comp ... S_v8.3.png

Aber HMAC + SHA werden i.d.R. unterstützt. Das sind ja die Kernkomponenten für PBKDF2...
Ich frag mich, ob es von der Performance reicht, wenn man also PBKDF2 nachbildet, dabei aber HMAC + SHA von WebCrypt nutzt oder ob das zu langsam ist und man praktisch nur mit geringer iteration-Anzahl arbeiten könnte...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten