Hallo...
ich hab schon in mehreren Webportalen sowas wie einen "Passwort-Komplexitaets-Messer" gesehen und wuerde gern mal wissen, wie sowas funktioniert.
Generell moechte ich in meinem Webprojekt ermoeglichen eine benoetigte Komplexitaetsstufe auszuwaehlen.
Zum Bsp waere da sowas denkbar:
Stufe 0: PW-Laenge groesser Null
Stufe 1: PW-Laenge groesser Sechs (oder Acht?)
Stufe 2: PW muss Zahlen UND Buchstaben enthalten
Stufe 3: PW muss den Anforderungen der Berkely-University entsprechen
Nun brauche ich also eine Funktion, die ein Passwort uebergeben bekommt und eine entsprechende Zahl von Null bis Drei zurueck gibt. Muss ich mir die komplett selber schreiben, oder gibts sowas in der Art schon, bzw irgendwas, dass mir die Sache erleichtern wuerde?
Falls ich sie mir selber schreiben muss, waere ich fuer Ideen offen
MfG und sowas alles...
passwort komplexitaet
- nkoehring
- User
- Beiträge: 543
- Registriert: Mittwoch 7. Februar 2007, 17:37
- Wohnort: naehe Halle/Saale
- Kontaktdaten:
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Ich kann dir da nichts fertiges anbieten. Die Stufen 0-2 sollten kein Problem sein,
wobei Du noch die Verwendung von Sonderzeichen berücksichtigen solltest.
Um die Berkeley-Anforderungen zu prüfen, müsstest Du wenigstens ein englisches
und
ein deutsches (bzw. Landessprachen) Wörterbuch anbinden und außerdem den
Benutzernamen mit in die Prüfung einbeziehen. Achja, ein Namensbuch wäre
dann eigentlich auch angesagt
Die Gruppenprüfung (a-z, A-Z, 0-9, ^a-zA-Z0-9) hättest Du ja ohnehin schon.
Wobei man sich klar machen sollte, dass eine solche Prüfung ein gewisses Gefahrenpotential
beinhaltet: Je spezifischere Bedingungen an ein Passwort gestellt werden, desto
mehr Abkürzungsmöglichkeiten gibt es für einen Brute-Force Algorithmus.
Wenn Passwörter mindestens 8 Stellen haben müssen, fallen z.B. schonmal
10.000.000 potentielle Passwörter weg, zumal man mit ziemlicher Sicherheit
von einer durchgängigen Länge von 8 Zeichen ausgehen kann - gerade wenn
gegen ein Wörterbuch gecheckt wird, tut sich niemand ein längeres Passwort
an.
Anforderungen an Charaktergruppen lassen teilweise sogar noch krassere Abkürzungen
zu.
Hier mal ein ganz schnell zusammengehacktes Beispiel, für die Grundtests.
Einen Schönheitspreis gewinne ich damit sicher nicht
wobei Du noch die Verwendung von Sonderzeichen berücksichtigen solltest.
Um die Berkeley-Anforderungen zu prüfen, müsstest Du wenigstens ein englisches
und
ein deutsches (bzw. Landessprachen) Wörterbuch anbinden und außerdem den
Benutzernamen mit in die Prüfung einbeziehen. Achja, ein Namensbuch wäre
dann eigentlich auch angesagt
Die Gruppenprüfung (a-z, A-Z, 0-9, ^a-zA-Z0-9) hättest Du ja ohnehin schon.
Wobei man sich klar machen sollte, dass eine solche Prüfung ein gewisses Gefahrenpotential
beinhaltet: Je spezifischere Bedingungen an ein Passwort gestellt werden, desto
mehr Abkürzungsmöglichkeiten gibt es für einen Brute-Force Algorithmus.
Wenn Passwörter mindestens 8 Stellen haben müssen, fallen z.B. schonmal
10.000.000 potentielle Passwörter weg, zumal man mit ziemlicher Sicherheit
von einer durchgängigen Länge von 8 Zeichen ausgehen kann - gerade wenn
gegen ein Wörterbuch gecheckt wird, tut sich niemand ein längeres Passwort
an.
Anforderungen an Charaktergruppen lassen teilweise sogar noch krassere Abkürzungen
zu.
Hier mal ein ganz schnell zusammengehacktes Beispiel, für die Grundtests.
Einen Schönheitspreis gewinne ich damit sicher nicht
Code: Alles auswählen
import re
def password_level(password):
tests = []
tests.append(re.compile("[a-z]"))
tests.append(re.compile("[A-Z]"))
tests.append(re.compile("[0-9]"))
tests.append(re.compile("[^0-9a-zA-Z]"))
level = test_patterns(tests, password)
if len(password) >= 6:
level += 1
if len(password) >= 8:
level += 1
return level
def test_patterns(patterns, password):
level = 0
for p in patterns:
if re.search(p, password) is not None:
level += 1
return level
print password_level("foo") # 1
print password_level("foo!") # 2
print password_level("foo!BAR") #4
print password_level("foo=!BAR") #5
Zuletzt geändert von dst am Sonntag 11. März 2007, 00:48, insgesamt 1-mal geändert.
- nkoehring
- User
- Beiträge: 543
- Registriert: Mittwoch 7. Februar 2007, 17:37
- Wohnort: naehe Halle/Saale
- Kontaktdaten:
Ah vielen Danke fuer die Hinweise und Inspirationen
Ich werde das Passwort-Checker-Modul separat vom Projekt entwickeln und hier als Projekt eintragen, wenn ich dazu komme ...dann kommen hoffentlich noch mehr Ideen zusammen.
Danke nochmal... ich geh dann gleichbald mal ins Bett ^^
Gut Nacht allerseits...
Ich werde das Passwort-Checker-Modul separat vom Projekt entwickeln und hier als Projekt eintragen, wenn ich dazu komme ...dann kommen hoffentlich noch mehr Ideen zusammen.
Danke nochmal... ich geh dann gleichbald mal ins Bett ^^
Gut Nacht allerseits...
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
habe vorhin das hier gefunden:
http://www.dicts.info/uddl.php
vorteil: daten als xml. (zwar nicht wirklich sinnvoll strukturiert, aber besser als das textfile)
http://www.dicts.info/uddl.php
vorteil: daten als xml. (zwar nicht wirklich sinnvoll strukturiert, aber besser als das textfile)
Wobei mit Wörterbuch in diesem Fall kein Buch mit Übersetzungen oder Begriffserklärungen
meint, sondern eine Wortliste, wie sie eben auch von Bruteforce-Programmen genutzt
werden.
Aber natürlich eignet sich das de-en-Wörterbuch von Leonidas hervorragend als
Grundlage, sollte nur umformatiert werden, damit das auslesen etwas beschleunigt
wird.
Nachtrag @ Dill: XML ist in diesem Fall kein Vorteil, da es wirklich nur um die Wörter
geht und nicht um Übersetzungen.
meint, sondern eine Wortliste, wie sie eben auch von Bruteforce-Programmen genutzt
werden.
Aber natürlich eignet sich das de-en-Wörterbuch von Leonidas hervorragend als
Grundlage, sollte nur umformatiert werden, damit das auslesen etwas beschleunigt
wird.
Nachtrag @ Dill: XML ist in diesem Fall kein Vorteil, da es wirklich nur um die Wörter
geht und nicht um Übersetzungen.
- nkoehring
- User
- Beiträge: 543
- Registriert: Mittwoch 7. Februar 2007, 17:37
- Wohnort: naehe Halle/Saale
- Kontaktdaten:
die cracklib ist dafuer doch sicher am besten geeignet... und die ist bei jedem vernuenftigen POSIX-System dabei.
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
jo, für den passwortchecker macht es kein sinn irgendein wörterbuch zu nehmen, da nimmt man möglichst das, was der angreifer nutzen würde.
mit dem "vorteil" meinte ich eigentlich nur ganz egoistisch: vorteilhaft für MICH!
mit dem "vorteil" meinte ich eigentlich nur ganz egoistisch: vorteilhaft für MICH!
- nkoehring
- User
- Beiträge: 543
- Registriert: Mittwoch 7. Februar 2007, 17:37
- Wohnort: naehe Halle/Saale
- Kontaktdaten:
Die cracklib-words ist wohl die dickste cracklib, die ich finden konnte. 17MB -.-
Naja, ich werde den Passwort-Checker nach Cracklibs suchen und die bestemoegliche rauspicken lassen.
Naja, ich werde den Passwort-Checker nach Cracklibs suchen und die bestemoegliche rauspicken lassen.
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
- nkoehring
- User
- Beiträge: 543
- Registriert: Mittwoch 7. Februar 2007, 17:37
- Wohnort: naehe Halle/Saale
- Kontaktdaten:
okay... ich habe jetzt einen cracklib-kramer... er schaut ob in irgendeiner zeile der cracklib das angegebene passwort enthalten ist...
dummerweise funktioniert das passwort "microsoft" immernoch ^^
kann man sowas ohne großen aufwand splitten... also in "micro" und "soft"? denn dann koennte man es als zusammensetzung zwei schwacher passwoerter entlarven...
EDIT: problem geloest... Microsoft steht drin, man muss nur passwort.lower() beim suchen verwenden...
dummerweise funktioniert das passwort "microsoft" immernoch ^^
kann man sowas ohne großen aufwand splitten... also in "micro" und "soft"? denn dann koennte man es als zusammensetzung zwei schwacher passwoerter entlarven...
EDIT: problem geloest... Microsoft steht drin, man muss nur passwort.lower() beim suchen verwenden...
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Naja, zu gucken, ob das PW im Wörterbuch steht, ist wohl etwas zu wenig.
Zunächst mal sind zusammengesetzte Wörter dadurch nicht abgedeckt. Und dann
ist es auch recht naheliegend, ein Passwort durch ein oder zwei zusätzliche Zeichen
zu verstärken. "Python1!" ist besser als "python", aber dennoch im Rahmen einer
Wörterbuchattacke, würde so aber sehr gut bewertet werden.
Andersherum -- jeden Wörterbucheintrag prüfen, ob er ein substring vom Passwort
ist -- würde das abgedeckt werden. Allerdings würde das die Anzahl der möglichen
Passwörter schon wieder drastisch reduzieren (s.o.), also vielleicht nur Wörter mit
wenigstens
vier Zeichen oder so prüfen. Wobei ein 17MB-Buch gegenzuprüfen sicher nicht
ganz ohne ist
Naja, bevor ich zu viel spekuliere, sollte ich mir vielleicht erstmal das cracklib-Wörterbuch
genauer angucken.
Zunächst mal sind zusammengesetzte Wörter dadurch nicht abgedeckt. Und dann
ist es auch recht naheliegend, ein Passwort durch ein oder zwei zusätzliche Zeichen
zu verstärken. "Python1!" ist besser als "python", aber dennoch im Rahmen einer
Wörterbuchattacke, würde so aber sehr gut bewertet werden.
Andersherum -- jeden Wörterbucheintrag prüfen, ob er ein substring vom Passwort
ist -- würde das abgedeckt werden. Allerdings würde das die Anzahl der möglichen
Passwörter schon wieder drastisch reduzieren (s.o.), also vielleicht nur Wörter mit
wenigstens
vier Zeichen oder so prüfen. Wobei ein 17MB-Buch gegenzuprüfen sicher nicht
ganz ohne ist
Naja, bevor ich zu viel spekuliere, sollte ich mir vielleicht erstmal das cracklib-Wörterbuch
genauer angucken.
- nkoehring
- User
- Beiträge: 543
- Registriert: Mittwoch 7. Februar 2007, 17:37
- Wohnort: naehe Halle/Saale
- Kontaktdaten:
Guten Morgen...
Ja solltest du... 1python und python1 stehen zB drindst hat geschrieben:Naja, bevor ich zu viel spekuliere, sollte ich mir vielleicht erstmal das cracklib-Wörterbuch
genauer angucken.
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Also wenn du als Regel vorgibst das zahlen und Sonderzeichen vorkommen müssen, kann man IMHO die Wörterbuchprüfung vergessen, oder?
Also wenn jemand ein Wort als Passwort wählt, was im Wörterbuch vorkommt, hat das wohl nie zahlen und Sonderzeichen enthalten. Also kann man sich das doch direkt sparen und angeben, "Zahl + Sonderzeichen vergessen"
Ein anderer Ansatz wäre es vielleicht, nicht auf Wörter zu testen, sondern Silben?!?!?
Die überprüfung/bewertung könnte vielleicht so aussehen: Alle Sonderzeichen/Zahlen aus dem Passwort löschen/splitten. Übrig gebliebene Zeichen auf Silben checken.
Ein Anzatz:
Edit: Was mir gerade einfällt... Ein Passwort-Komplexitäts-Bewertung macht im Web wahrscheinlich erst richtig spass, wenn es in JS geschrieben ist, damit der User direkt Feedback bekommt.
Und noch was anderes: In KeePass wird aus dem Passwort irgendwie die Komplexität in Bits angegeben, keine Ahnung was/wie das berechnet wird:
(Dieser Streifen direkt unter dem Passwort)
Also wenn jemand ein Wort als Passwort wählt, was im Wörterbuch vorkommt, hat das wohl nie zahlen und Sonderzeichen enthalten. Also kann man sich das doch direkt sparen und angeben, "Zahl + Sonderzeichen vergessen"
Ein anderer Ansatz wäre es vielleicht, nicht auf Wörter zu testen, sondern Silben?!?!?
Die überprüfung/bewertung könnte vielleicht so aussehen: Alle Sonderzeichen/Zahlen aus dem Passwort löschen/splitten. Übrig gebliebene Zeichen auf Silben checken.
Ein Anzatz:
Code: Alles auswählen
import re
password = "Pass123Wort"
syllables = ["pass", "wort"]
parts = re.split("[^a-zA-Z]+", password)
score = 10
for part in parts:
if part.lower() in syllables:
score -= 1
print score
Und noch was anderes: In KeePass wird aus dem Passwort irgendwie die Komplexität in Bits angegeben, keine Ahnung was/wie das berechnet wird:
(Dieser Streifen direkt unter dem Passwort)
Die Bits berechnen sich aus der "effektiven Länge" und der Zeichenklasse zu der jedes einzelne Zeichen gehört.
In die "effektive Länge" geht zum Beispiel mit ein, dass die Differenzen zwischen Zeichen variabel genug sein sollten, also 'Lu3hd72nY' ist "effektiv länger" als 'abcd1234' oder 'aXaXaX'.
Der Informationsgehalt von Zeichenklassen hängt von der Anzahl der möglichen Zeichen in der Klasse ab. Bei Buchstaben gibt es 26 Möglichkeiten, bei Ziffern 10 usw.
In die "effektive Länge" geht zum Beispiel mit ein, dass die Differenzen zwischen Zeichen variabel genug sein sollten, also 'Lu3hd72nY' ist "effektiv länger" als 'abcd1234' oder 'aXaXaX'.
Der Informationsgehalt von Zeichenklassen hängt von der Anzahl der möglichen Zeichen in der Klasse ab. Bei Buchstaben gibt es 26 Möglichkeiten, bei Ziffern 10 usw.