Passwortgenerator für .htpasswd in Python?

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
genrich
User
Beiträge: 91
Registriert: Sonntag 27. Juni 2004, 17:46

Ein ganz klares Jein von meiner Seite aus :cry:

Hosteurope bietet leider kein echtes https an, sondern nur ein sog. SSL-proxy: http://www.hosteurope.de/?direct=225

Mit dem werden aber nur die Daten vom Server zum Client verschlüsselt, aber nicht anders herrum... Doch gerade beim Einloggen, werden User und Passwort vom Client zum Server geschickt. Das ist somit trotz "https" nur im Plaintext möglich...

Wenn es keine Möglichkeit gibt mittels Python und socket.ssl() etwas zu basteln, dann werde ich einfach .htaccess nutzen :(
Doch ich hab noch nirgends eine einfache beschreibung gefunden, wie man mit socket.ssl() umgehen muß...
genrich
User
Beiträge: 91
Registriert: Sonntag 27. Juni 2004, 17:46

Mir fällt da gerade eine Lösung ein, auch wenn diese nicht wirklich Sicher ist... Es werden zumindest keine Passwörter in Plaintext übermittelt...

Die Idee:

Das Pythonskript auf dem Server schickt ein normales HTML-Formular zum einloggen zum Client.
Darin befindet sich eine "zufällige" Zeichenkette.

In diesem LogIn-Formular wird per JavaScript das eingegebene Passwort mit der Zufälligen Zeichenkette "verschlüsselt".

Zum Server wird nur der Username und das "verschlüßelte" Passwort geschickt (nicht aber die "zufällige" Zeichenkette -> Schlüssel)

Da der Server die "zufällige" Zeichenkette sich gemerkt hat, kann er das Passwort entschlüsseln...


Wie gesagt, es ist nicht wirklich sicher... Wer den Datenverkehr in beiden Richtungen abhöhrt, der kommt auch rein :( Es reicht allerdings nicht, nur die gesendeten Daten einfach noch mal an den Server zu schicken, weil die "zufällige" Zeichenkette ihre gültigkeit verloren hat.
Zum "knacken" der Passwortes muß man vielmehr die Daten vom Server zum Client und die zurückgeschickten Daten abfangen. Dann muß man sich aber noch mal mit dem JavaScript außeinander setzten. Auch wenn es für Programmiere ein großes Problem ergeben sollte, das JavaScript so umzustricken, das man das Passwort zurück entschlüßeln kann...

Zumindest setzt diese kompleziertere Methode sehr viel Kriminelle energie vorraus. Es ist nicht ganz so "einfach", als eine Absicherung nur mit .htaccess
genrich
User
Beiträge: 91
Registriert: Sonntag 27. Juni 2004, 17:46

Vergessen zu erwähnen.... Das User-Passwort ist natürlich auf dem Server als md5, hashwert oder per crypt() abgespeichert und sollte danach verglichen werden :)
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Sehr Interessant, du bringst mich da auf eine Idee...

Absolut richtig, das ohne SSL keine richtige Sicherheit gewährleistet ist... Allerdings stinkt es mir auch, das bei meinen kleinen Python-cgi-Homepage-Tools der Login mit dem senden von User/Passwort im Klartext erfolg...

Es gibt doch da von Ralf Mieke die Implementierung des MD5-Fingerprint in JavaScript:
http://www.miekenet.de/publikationen/publi01.html
Ich hab es getestet und es funktioniert! Die MD5 Checksummen sind identisch mit der Python MD5-Summe.

Das könnte man nutzen um zumindest das Passwort nicht mehr im Klartext übermitteln zu müssen...


Also meine Idee ist es, das Passwort vom JavaScript als MD5 zum Server zu senden...
Den UserNamen könnte man nach genrichs Idee mit dieser "Zufälligen Zeichenkette verschlüsseln"...

Auf dem Server wird der UserName entschlüßelt. Mit dem entschlüsselten UserNamen schaut man dann in eine art htaccess-Datei nach dem MD5-Passwort und vergleicht es mit dem geschickten...

Jetzt ist nur ein Problem, das auf dem Server im Klartext der UserName und das MD5-Passwort stehen... Kommt man an diese Daten herran, könnte man sich damit einloggen....
Um das zu verhinden, werden nicht die MD5-Passwörter, die man vom JavaScript erhält, direkt auf dem Server gespeichert, sondern davon wieder ein MD5-Fingerprint...


Wenn ich mir das recht überlege ist die Sicherheit nur gerinfügig höher als in deiner Variante... Aber mit gefällt das besser :) Ich werd das mal versuchen umzusetzten...
Master_of_Mechanic
User
Beiträge: 5
Registriert: Samstag 12. Mai 2007, 18:35

Hallo
wäre eine schöne Sache mit hilfe des Moduls crypt verschlüsselte Passwörter für die .htpasswd Datei zu erstellen. Leider bleibe ich als Windows user dabei aussen vor. :(

was gibt es da für alternativen. ich möchte einfach nur ein Passwort (welches ich mit einem Pythonskript "verwalte") so verschlüsseln das es in die .htpasswd Datei auf meiner Webpage "passt"

Das DOS-Utility HTPASSWD.EXE finde ich nicht gerade ansprechend, vorallem da es sich nicht in Python einbauen läst. :D
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

.oO(Da hat aber jemand einen alten Thread rausgekramt)
Master_of_Mechanic hat geschrieben:Das DOS-Utility HTPASSWD.EXE finde ich nicht gerade ansprechend, vorallem da es sich nicht in Python einbauen läst. :D
Du könntest diese EXE Datei evtl. mit subprocess nutzten: [wiki]Neue Features#Subprocess[/wiki]

Aber schau mal hier: http://docs.python.org/lib/module-crypt.html

IMHO kann man auch MD5 und SHA in .htaccess Dateien nutzten...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Master_of_Mechanic hat geschrieben:Das DOS-Utility HTPASSWD.EXE finde ich nicht gerade ansprechend, vorallem da es sich nicht in Python einbauen läst. :D
Hallo MoM!

Das ist aber oft die einfachste und naheliegendste Variante. Einfach ein schon vorhandenes Tool nehmen und über Python aufrufen.

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-

import subprocess
from subprocess import PIPE

HTPASSWD = r"J:\Apache\bin\htpasswd.exe"


def generate_passwd(username, password):
    args = [HTPASSWD, "-b", "-n", "-", username, password]
    p = subprocess.Popen(args, executable = HTPASSWD, stdout = PIPE, stderr = PIPE)
    return p.stdout.read()


def main():
    print generate_passwd("gerold", "uuu")


if __name__ == "__main__":
    main()

Code: Alles auswählen

gerold:$apr1$QV3.....$YTlQn5PAhVIeosSJtLbns.
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Master_of_Mechanic hat geschrieben:wäre eine schöne Sache mit hilfe des Moduls crypt verschlüsselte Passwörter für die .htpasswd Datei zu erstellen. Leider bleibe ich als Windows user dabei aussen vor. :(
Dazu gibt es eben SSH: man generiert das Passwort aauf dem Server und schreibt es gleich an die richtige Stelle. Praktisch.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
thelittlebug
User
Beiträge: 188
Registriert: Donnerstag 20. Juli 2006, 20:46
Wohnort: Wien
Kontaktdaten:

Da ja einige ganz begeister von diesem "JS MD5 Password" Ding sind stell ich mal eine Frage: "Ist das sniffen eines Plaintext Passwords leichter als das sniffen einer MD5 Zeichenkette?"

Ich glaube nicht ;)
-> MD5 Javascript = Scheinsicherheit

lgherby
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Naja solche Challange Response Algorithmen schützen nicht vor einem Man in the Middle Angriff. Dabei wird dann entweder das Javascript so manipuliert dass es das Passwort heimlich weiterleitet oder es wird ganz einfach der ganze Login umgeleitet. Das selbe Problem besteht auch beim Verwenden von SSL ohne die entsprechenden Zertifikate/Publickeys zu überprüfen. Die SSL Implementierung von CPython erlaubt das derzeit nicht und ist somit eigentlich nicht zu gebrauchen.

Die Sicherheit von solchen Methoden sind also eher gering ;)
Antworten