passwort komplexitaet

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

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...
[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
dst
User
Beiträge: 27
Registriert: Mittwoch 28. Februar 2007, 23:42

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 ;)

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.
Benutzeravatar
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...
[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
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

hast du zufällig ein freies en-de wörterbuch?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dill hat geschrieben:hast du zufällig ein freies en-de wörterbuch?
Ich hätte de-en anzubieten.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

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)
dst
User
Beiträge: 27
Registriert: Mittwoch 28. Februar 2007, 23:42

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.
Benutzeravatar
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
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

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! :twisted:
Benutzeravatar
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.
[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
Benutzeravatar
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...
[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
dst
User
Beiträge: 27
Registriert: Mittwoch 28. Februar 2007, 23:42

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.
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Guten Morgen...
dst hat geschrieben:Naja, bevor ich zu viel spekuliere, sollte ich mir vielleicht erstmal das cracklib-Wörterbuch
genauer angucken.
Ja solltest du... 1python und python1 stehen zB drin ;)
[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
Benutzeravatar
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:

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
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:
Bild
(Dieser Streifen direkt unter dem Passwort)

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

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.
Antworten