Passwort-Sicherheits-Check

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
nfehren
User
Beiträge: 98
Registriert: Donnerstag 31. Oktober 2013, 15:11

Servus mal wieder,

Ich bin gerade wieder dabei mit kleinen Progrämmchen die Sprache Python3 zu lernen. Momentan bin ich dabei ein Programm zu schreiben, dass nach Abfrage eines Passworts guckt, ob es sicher ist und den User solange verbessern lässt, bis es sicher ist. Die erste Abfrage ist ob die Länge größer als 9 ist. Jedoch die anderen Abfragen sind schwerer für mich. Man muss abfragen, ob groß- kleinbuchstaben vorhanden sind und ob Ziffern und sonderzeichen vorkommen. Ich habe mir das so gedacht, dass ich einfach für alles eine Liste erstelle (Eine mit allen Großbuchstaben, eine mit allen Kleinbuchstaben, ...). Jedoch weis ich nicht wie ich nun abfragen kann ob die Variable "passwort" ein Zeichen aus einer von diesen Listen enthält. Freue mich über eure Hilfe :)

Code: Alles auswählen

#!/usr/bin/python3
import time

#Listen:
groß = ["ABCDEFGHIJKLMNOPQRSTUVWXYZ"]
klein = ["abcdefghijklmnopqrstuvwxyz"]
zahlen = ["1234567890"]
sonderzeichen = ["""!"§$%&/()=?`´^°#'+*-_.:,;<>|"""]

print("""Erstellen sie sichere Passwörter mit dem "Passwortgenerator"!""")

print("\n1. Passwort auf Sicherheit überprüfen\n"
      "2. Sicheres Passwort generieren")
awl = int(input("Auswahl: "))

if awl == 1:
    print("\nBitte bedenken sie: Sichere Passwörter werden so aufgebaut:\n"
          "- Das Passwort muss aus mindestens neun Zeichen bestehen\n"
          "- Das Passwort muss Großbuchstaben aufweisen\n"
          "- Das Passwort muss Kleinbuchstaben aufweisen\n"
          "- Im Passwort müssen Ziffern vorkommen\n"
          "- Im Passwort müssen Sonderzeichen vorkommen\n")
    time.sleep(0.5)
    while True:
        passwort = input("\nGeben sie nun ihr Passwort ein, dass sie testen wollen: ") 
        if len(passwort) >= 9:
            break
        else:
            print("Keine 9 Zeichen oder mehr!")
            continue
        if groß in passwort:
            print("Keine Großbuchstaben")
            break
        else: 
            break
if awl == 2:
    print("")

Edit: Ich habe mit

Code: Alles auswählen

        if groß in passwort:
            break
        else: 
            print("Keine Großbuchstaben")
            break
nur ausprobiert.

Edit Nr.2:

Ausprobiert habe ich auch:

Code: Alles auswählen

        if passwort.isupper() = True:
            break
        else:
            print("Keine Großbuchstaben")
            continue
funktioniert aber auch nicht..
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Guck Dir mal die Doku zum string-Modul an. Dort findest Du eine Menge vordefinierter Mengen.

Wir hatten unlängst einmal ein Beispiel, wo gewisse Bedingungen für ein PW getestet werden sollten. Benutze mal die Suchfunktion und schau, ob Du den Thread findest.

Es läuft darauf hinaus, dass Du pro Kriterium, was Du prüfen willst, eine Funktion schreibst, die die geforderte Eigenschaft überprüft.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@nfehren: Dann überleg doch mal was Du mit ``groß in passwort`` fragst. `groß` ist eine Liste mit einem Element und dieses eine Element ist eine Zeichenkette mit allen Grossbuchstaben. Und das Passwort ist eine Zeichenkette die der Benutzer eingegeben hat. Du fragst also ob eine Liste mit einer Zeichenkette in einer anderen Zeichenkette enthalten ist. Das ist natürlich immer falsch, denn eine Liste ist niemals in einer Zeichenkette enthalten. Der Test macht so keinen Sinn.

Man könnte das mit ``in``-Tests und Schleifen, beziehungsweise `any()` und einem Generatorausdruck machen, aber ich würde wahrscheinlich eher Mengenoperationen verwenden, also den `set`-Datentyp.

Ist Ä kein Grossbuchstabe? Oder ü kein Kleinbuchstabe? Oder € kein Sonderzeichen? Was ist mit Ω, Sonderzeichen oder Grossbuchstabe?
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Um mal einen Ansatz zu liefern:

Code: Alles auswählen

>>> import string
>>> password = 'PASSWORD'
>>> any(c in string.ascii_lowercase for c in password)
False
>>> password = 'PASSwORD'
>>> any(c in string.ascii_lowercase for c in password)
True
>>> (set(password)).intersection(set(string.ascii_lowercase))
{'w'}
Dami123
User
Beiträge: 225
Registriert: Samstag 23. Februar 2013, 13:01

Du könntest über das Password iterieren und die einzelnen Buchstaben testen mit "isupper()", "islower()", "isdigit()" und wenn keines von denen zutrifft sollte es ein Sonderzeichen sein.
Für das Sonderzeichen gibt es ggf. auch eine andere Methode wie z.B. die von dir vorgeschlagene Listen Variante, so kann man auch die Sonderzeichen festlegen, die verwendet werden dürfen.
BlackJack

@/me: Bei der letzten Zeile kann man sich ein Klammerpaar und einen `set()`-Aufruf sparen:

Code: Alles auswählen

In [6]: set(password).intersection(string.ascii_lowercase)
Out[6]: {'w'}
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

BlackJack hat geschrieben:@/me: Bei der letzten Zeile kann man sich ein Klammerpaar und einen `set()`-Aufruf sparen
Da merkt man was passiert, wenn man vorher 5 Stunden intensiv in anderen Programmiersprachen unterwegs ist. :?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

/me hat geschrieben: Da merkt man was passiert, wenn man vorher 5 Stunden intensiv in anderen Programmiersprachen unterwegs ist. :?
Welche war das denn? C++? ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
nfehren
User
Beiträge: 98
Registriert: Donnerstag 31. Oktober 2013, 15:11

es gibt ja eine methode einen String abzufragen, ob er nur großbuchstaben besitzt (.isupper()) gibt es auch eine methode um zu prüfen ob nur min. einen Großbuchstabe vorhanden ist?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Na. z.B. über den Schnitt mit der Menge aller Großbuchstaben! Wenn da nur *ein* Element enthalten ist, so kommt nur ein Großbuchstabe im Passwort vor. Das wurde doch schon gezeigt!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
nfehren
User
Beiträge: 98
Registriert: Donnerstag 31. Oktober 2013, 15:11

Hyperion hat geschrieben:Na. z.B. über den Schnitt mit der Menge aller Großbuchstaben! Wenn da nur *ein* Element enthalten ist, so kommt nur ein Großbuchstabe im Passwort vor. Das wurde doch schon gezeigt!
Könntest du mir das vielleicht an genau diesem Beispiel zeigen?

Code: Alles auswählen

        if not (passwort.isupper():
            print("Keine Großbuchstaben {0}".format(passwort))
            continue
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

nfehren hat geschrieben: Könntest du mir das vielleicht an genau diesem Beispiel zeigen?
Nein! Du öffnest mal eine Shell und probierst das selber aus ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
nfehren
User
Beiträge: 98
Registriert: Donnerstag 31. Oktober 2013, 15:11

Hyperion hat geschrieben:
nfehren hat geschrieben: Könntest du mir das vielleicht an genau diesem Beispiel zeigen?
Nein! Du öffnest mal eine Shell und probierst das selber aus ;-)
Ich weis aber leider nicht genau was du meinst.

Edit: Wie kann ich einen String umändern z.B "[s,s,2,f,5,2]" in "ss2f52"?
Zuletzt geändert von nfehren am Montag 17. Februar 2014, 15:37, insgesamt 1-mal geändert.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@nfehren
"Schnitt" heißt übersetzt `intersection` und findet sich unter diesem Namen auch als `set`-Methode wieder.

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
BlackJack

Eine Zeichenkette "[s,s,2,f,5,2]" solltest Du gar nicht erst haben. Wo kommt die denn her? Fang bitte nicht an Datenstrukturen in Zeichenketten umzuwandeln um dann auf diesen Zeichenketten zu operieren statt gleich auf der Datenstruktur.
nfehren
User
Beiträge: 98
Registriert: Donnerstag 31. Oktober 2013, 15:11

BlackJack hat geschrieben:Eine Zeichenkette "[s,s,2,f,5,2]" solltest Du gar nicht erst haben. Wo kommt die denn her? Fang bitte nicht an Datenstrukturen in Zeichenketten umzuwandeln um dann auf diesen Zeichenketten zu operieren statt gleich auf der Datenstruktur.
['N', 'E'] [7, 1, 6] ['s', 'p'] ['!', '$']
sowas hier zum Beispiel.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Du weißt nicht, was eine Python-Shell ist? Ok, dann fang bitte mit dem offiziellen Tutorial an! (Es befindet sich in der Python Doku; es existiert eine deutsche Übersetzung im Netz). Dort wird iirc direkt zu Beginn beschrieben, wie man so eine REPL startet und darin arbeitet.

Genau für das Ausprobieren solcher kleiner Dinge ist die Shell da :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

nfehren hat geschrieben:['N', 'E'] [7, 1, 6] ['s', 'p'] ['!', '$']
sowas hier zum Beispiel.
Das sieht aus wie die Menge der Elemente aus denen Daten vorhanden sein müssen, aber nicht wie ein eingegebener String.

Schau mal, du hast bereits massive Schwierigkeiten uns zu beschreiben was du eigentlich tun möchtest. So lange du das nicht schaffst wirst du erst recht nicht in der Lage sein, das in sinnvoll strukturierten Programmcode umzusetzen. Erschwerend kommt dazu, dass du trotz Codebeispielen gegebene Antworten nicht verstehst (z.B. die Sache mit Set und intersection) und dann nicht zielgerichtet nachfragst. Bring Struktur in deine Planung hinein, sonst wird das nichts.
Antworten