django-secure-js-login
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.
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Warum?!?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.
StartSSL hatte ich mal Probiert. War mir ehrlich gesagt viel zu kompliziert.DasIch hat geschrieben:Ein Zertifikat kann man übrigens problemlos kostenlos von StartSSL bekommen.
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:
Warum wohl? Ich vermute mal, es ist zu Aufwendig...www.python-forum.de verwendet ein ungültiges Sicherheitszertifikat.
Das Zertifikat gilt nur für vst-opdm.de.
Es ist kein "obfuscation" im Sinne von "Verschleierung"...DasIch hat geschrieben:Dieser JS Login ist nette obfuscation mehr aber auch nicht, vor allem ist es nach keiner brauchbaren Definition "secure".
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.
Sourcen noch da?!?Sirius3 hat geschrieben:Ich habe schon vor Jahren eine für beide Seiten 100% sichere Authentifizierung auf Basis von PAK geschrieben.
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Nu auch hier:
- https://coveralls.io/r/jedie/django-secure-js-login
und nun auch alles ok:
- https://travis-ci.org/jedie/django-secure-js-login/
TODO: Mehr Tests mit Ausnahmen/Falschen Daten...
- https://coveralls.io/r/jedie/django-secure-js-login
und nun auch alles ok:
- https://travis-ci.org/jedie/django-secure-js-login/
TODO: Mehr Tests mit Ausnahmen/Falschen Daten...
- 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.
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.
- 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
https://github.com/jedie/django-secure-js-login#usage
Gibt hier eine schrittweise, bebilderte Erklärung, wie man bei StartSSL ein Zertifikat bekommt: https://github.com/ioerror/duraconf/blo ... E.markdownjens hat geschrieben:StartSSL hatte ich mal Probiert. War mir ehrlich gesagt viel zu kompliziert.DasIch hat geschrieben:Ein Zertifikat kann man übrigens problemlos kostenlos von StartSSL bekommen.
Man muß halt abwägen. Für was man es einsetzt...
[…]Warum wohl? Ich vermute mal, es ist zu Aufwendig...www.python-forum.de verwendet ein ungültiges Sicherheitszertifikat.
Das Zertifikat gilt nur für vst-opdm.de.
Ohne SSL kannst Du keine sichere Passwort-Übertragung machen. Das liegt daran, dass das JavaScript von einem Angreifer ausgetauscht werden kann.
- 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
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
- 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
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
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Interessanter blog post: http://tonyarcieri.com/whats-wrong-with-webcrypto
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
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.jens hat geschrieben:Interessanter blog post: http://tonyarcieri.com/whats-wrong-with-webcrypto
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
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.
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.
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
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.jens hat geschrieben:Muß mal sehen, welche von den meisten Browsern unterstützt wird.
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
Leider läuft PBKDF2 nicht überall.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
Demnach würde sich ja HMAC mit SHA-512 anbieten, was?
Das ist die alte Argumentations-Schleife, neu gestartet...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.
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:
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...DasIch hat geschrieben:kannst du es mindestens genauso gut und in der Regel besser auf dem Server machen.
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.jens hat geschrieben:Demnach würde sich ja HMAC mit SHA-512 anbieten, was?
- 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.
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.
- 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...
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...
- 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
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
- 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
- https://travis-ci.org/jedie/django-secu ... s/72680308
EDIT: WebCrypto PBKDF2 test .html und .py datei: https://gist.github.com/jedie/14f5b342ac44418368f9
Ich mußte dazu nur noch einen wait einfügen
Getestet wird nun mit Firefox Firefox v38.0esr
- https://travis-ci.org/jedie/django-secu ... s/72680308
EDIT: WebCrypto PBKDF2 test .html und .py datei: https://gist.github.com/jedie/14f5b342ac44418368f9
- 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:
s.a.: https://github.com/jedie/django-secure-js-login#tryout
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
- 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
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
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Genauso sieht es wohl in der Apfel welt aus: https://github.com/jedie/WebCrypto-comp ... S_v8.3.pngjens 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
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...