Seite 1 von 1

Passwort-Sicherheits-Check

Verfasst: Montag 17. Februar 2014, 12:53
von nfehren
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..

Re: Passwort-Sicherheits-Check

Verfasst: Montag 17. Februar 2014, 13:02
von Hyperion
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.

Re: Passwort-Sicherheits-Check

Verfasst: Montag 17. Februar 2014, 13:05
von 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?

Re: Passwort-Sicherheits-Check

Verfasst: Montag 17. Februar 2014, 13:09
von /me
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'}

Re: Passwort-Sicherheits-Check

Verfasst: Montag 17. Februar 2014, 13:18
von Dami123
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.

Re: Passwort-Sicherheits-Check

Verfasst: Montag 17. Februar 2014, 13:19
von 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'}

Re: Passwort-Sicherheits-Check

Verfasst: Montag 17. Februar 2014, 13:21
von /me
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. :?

Re: Passwort-Sicherheits-Check

Verfasst: Montag 17. Februar 2014, 13:26
von Hyperion
/me hat geschrieben: Da merkt man was passiert, wenn man vorher 5 Stunden intensiv in anderen Programmiersprachen unterwegs ist. :?
Welche war das denn? C++? ;-)

Re: Passwort-Sicherheits-Check

Verfasst: Montag 17. Februar 2014, 13:50
von nfehren
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?

Re: Passwort-Sicherheits-Check

Verfasst: Montag 17. Februar 2014, 14:03
von Hyperion
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!

Re: Passwort-Sicherheits-Check

Verfasst: Montag 17. Februar 2014, 14:16
von nfehren
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

Re: Passwort-Sicherheits-Check

Verfasst: Montag 17. Februar 2014, 14:50
von Hyperion
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 ;-)

Re: Passwort-Sicherheits-Check

Verfasst: Montag 17. Februar 2014, 15:04
von nfehren
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"?

Re: Passwort-Sicherheits-Check

Verfasst: Montag 17. Februar 2014, 15:37
von mutetella
@nfehren
"Schnitt" heißt übersetzt `intersection` und findet sich unter diesem Namen auch als `set`-Methode wieder.

mutetella

Re: Passwort-Sicherheits-Check

Verfasst: Montag 17. Februar 2014, 15:57
von 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.

Re: Passwort-Sicherheits-Check

Verfasst: Montag 17. Februar 2014, 15:58
von nfehren
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.

Re: Passwort-Sicherheits-Check

Verfasst: Montag 17. Februar 2014, 16:07
von Hyperion
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 :-)

Re: Passwort-Sicherheits-Check

Verfasst: Montag 17. Februar 2014, 16:11
von /me
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.