Montag, 11. Februar 2013

Password Analyzer

Ein Passwort hinsichtlich seiner Qualität zu prüfen, wie es bei HP Codewars 2007 (Problem 7) gefordert war, ist keine Herausforderung. Die Funktion war sehr schnell gecodet:
def passwort_pruefen(passwort):
    ''' Prüft die Qualität eines passworts
    und kann 4 Qualitätsstufen als String
    zurückgeben; die Prüfung umfasst folgende
    Punkte:
    * Länge korrekt len(pw) >= 8?
    * wenigstens ein Großbuchstabe enthalten?
    * wenigstens eine Ziffer enthalten?
    
    '''
    qualitaet = 0
    
    # Ist die Länge korrekt, d. h. >= 8?
    if len(passwort) >= 8:   
        qualitaet += 1
    # Ist wenigstens ein Großbuchstabe enthalten?
    for a in passwort:       
        if a.isupper():
            qualitaet += 1
            break
    # Ist wenigstens eine Zahl enthalten?
    for a in passwort:       
        if a.isdigit():
            qualitaet += 1
            break
    
    # Rückgabe
    if qualitaet == 0:
        return "WEAK"
    elif qualitaet == 1:
        return "ACCEPTABLE"
    elif qualitaet == 2:
        return "GOOD"
    else:
        return "STRONG"


passwoerter = ["lizard","aardvark","Aardvark","Aardvark77"]

for passwort in passwoerter:
    
    # eingabe = input("Enter your password: ")
    print("Enter your password: {}".format(passwort))
    print("This password is {}.\n".format(passwort_pruefen(passwort)))
Auch wenn ich aus Bequemlichkeit auf die Eingabe von Passwörtern verzichtet habe und sie aus einer Liste beziehe, bleibt mein Fazit: Keine Herausforderung. Einige andere Aufgaben aus dem Jahr sind schon eine härtere Nuss.

3 Kommentare:

  1. Schöne Idee mit dem Zähler, aber wesentlich eleganter und kürzer wäre es mit Regular expressions geworden.

    Siehe dazu z.B. hier: http://forums.asp.net/t/918584.aspx/1

    AntwortenLöschen
  2. Danke für den Hinweis! Ich bookmarke mir mal diesen Blogpost und schaue mir das re-Modul noch mal an. Den Code knapper zu formulieren, finde ich interessant; das klingt spannend. Das mit Python zu machen, wäre noch mal eine Herausforderung.

    AntwortenLöschen
  3. Die `any()`-Funktion kann die Schleifen verkürzen. Man kann zusätzlich den Umstand ausnutzen, dass in Python die Wahrheitswerte von Zahlen abgeleitet sind und man damit rechnen kann. Und statt der ganzen ``if``/``elif``\s könnte man den Qualitätswert als Index in eine Liste mit den Qualitätsstufen verwenden. Das alles in einen Ausdruck gequetscht:

    def password_quality(password): return ['WEAK', 'ACCEPTABLE', 'GOOD', 'STRONG'][sum([len(password) >= 0, any(c.isupper() for c in password), any(c.isdigit() for c in password)])]

    AntwortenLöschen