kleiner Passwort Generator

Code-Stücke können hier veröffentlicht werden.
Antworten
MGS_Freak
User
Beiträge: 35
Registriert: Donnerstag 13. Januar 2011, 13:50
Wohnort: Schweiz

Hallo liebe Python Community

Endlich habe ich wieder mal Zeit gefunden mich mit Python zu befassen :).
Rausgekommen ist ein sehr kleiner Passwort Generator der noch viel Verbesserungspotenzial hat wie z.B. mehrfach Passwörter zu erstellen oder gleich mit Usernamen abzuspeichern -> werde ich mal noch ergänzen!

Hier der Code:

Code: Alles auswählen

import string
import random

class PasswordGenerator(object):
    """a simple and easy to use password generator"""
    def __init__(self):
        self.alphabet = string.ascii_letters + string.digits

    def set_password_length(self):
        self.password_length = int(raw_input("Please enter a number to set the length of your password: "))     

    def generate_password(self):
        self.password = str().join(random.choice(self.alphabet) for n in range(self.password_length))

    def print_password(self):
        print self.password

        
def main():
    pw = PasswordGenerator()
    pw.set_password_length()
    pw.generate_password()
    pw.print_password()

if __name__ == "__main__":
    main()
Über Feedback und vor allem Kritik freue ich mich sehr,
Euer MGS_Freak
BlackJack

@MGS_Freak: Die Klasse ist total überflüssig und statt dem ``str()`` würde man eher ``''`` schreiben.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

BlackJack hat geschrieben:@MGS_Freak: Die Klasse ist total überflüssig ...
Ich würde sogar sagen sie ist sogar falsch (vom Design her). Vermischung von Benutzerinteraktion mit Berechnung und Darstellung... falscher geht es kaum :D

@MGS_Freak: Auch wenn Du die Klasse streichen solltest, kurz eine Anmerkung zur Benennung von Methoden: Eine Methode muss das "Substantiv" der Klasse nicht wiederholen... was sollte eine ``generate``-Methode in einer ``Password``-Klasse wohl machen, wenn nicht ein Passwort zu generieren? ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

Spätestens wenn man das `*password*` aus den Methodennamen raus lässt, sollte man `pw` in `password` umbenennen.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Man könnte den Ansatz noch halbwegs sinnvoll retten:

Code: Alles auswählen

import random

class PasswordGenerator(object):
    def __init__(self, alphabet, length):
        self.alphabet = alphabet
        self.length = length
    
    def generate(self):
        return "".join(random.choice(self.alphabet) for _ in xrange(self.length))
Das Leben ist wie ein Tennisball.
MGS_Freak
User
Beiträge: 35
Registriert: Donnerstag 13. Januar 2011, 13:50
Wohnort: Schweiz

EyDu hat geschrieben:Man könnte den Ansatz noch halbwegs sinnvoll retten:

Code: Alles auswählen

import random

class PasswordGenerator(object):
    def __init__(self, alphabet, length):
        self.alphabet = alphabet
        self.length = length
    
    def generate(self):
        return "".join(random.choice(self.alphabet) for _ in xrange(self.length))
Erstmal GROSSES Dankeschön an alle Rückmeldungen!

Das man statt string() auch "".join nehmen kann wusste ich nicht, find ich allerdings super, merci.

Ursprünglich war es auch keine Klasse sondern schlicht dies:

Code: Alles auswählen

import random
import string
password_length = 8
alphabet = string.ascii_letters + string.digits
password = str().join(random.choice(alphabet) for n in range(password_length))
print password
wollte einfach mal sehen ob ich es schaffe ein (hier leider nicht der Fall :() sinnvolle Klasse zu erstellen...
Ok klar, generate in Verbindung mit ner Passwortklasse muss nicht extra generate_password heissen, danke auch für diesen Tipp!

So nochmals ein grosses Dankeschön an alle die sich die Zeit genommen haben, einfach super das Forum!
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Zwischen Deinem Ansatz und einer Klasse bleibt... *Trommelwirbel* eine Funktion ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
MGS_Freak
User
Beiträge: 35
Registriert: Donnerstag 13. Januar 2011, 13:50
Wohnort: Schweiz

Hyperion hat geschrieben:Zwischen Deinem Ansatz und einer Klasse bleibt... *Trommelwirbel* eine Funktion ;-)
Haha, genau - und danke für den Trommelwirbel ;) setz mich dann am Weekend dahinter und versuche eine Funktion mit Sinn zu schreiben :)
Malta
User
Beiträge: 83
Registriert: Samstag 8. Januar 2011, 23:51

Ich habe mich auch mal an einen Passwort Generator versucht, na ja er funktioniert, aber ganz zufrieden bin ich auch nicht. Das sieht ein wenig komisch aus, aber etwas bessers ist mir noch nicht eingefallen.

Code: Alles auswählen

    for ic, e in zip(select_text,string_seletion):
        if ic:
            auswahl += e

Code: Alles auswählen

import random
import string
 
string_seletion = (string.ascii_uppercase, string.ascii_lowercase,
                   string.digits, string.punctuation,
                   "äöüÖÜÄáÁŕŔźŹćĆéÉíÍîÎêÊôÔûÛâÂẑẐ",
                   "因此特別適合團隊作的寫作方式系統為這個社群提供了簡單的交流工具獲得相關參加國家大量電視節目的播映權")
 
def generate_password(lenght_password, select_text):
    """return a random string"""
    auswahl = ""
    for ic, e in zip(select_text,string_seletion):
        if ic:
            auswahl += e
    #random char in the lenght of value of the scrollbar
    return "".join(random.choice(auswahl) for _ in range(lenght_password))

print generate_password(8, (1,1,0,0,0,0))
MGS_Freak
User
Beiträge: 35
Registriert: Donnerstag 13. Januar 2011, 13:50
Wohnort: Schweiz

MGS_Freak hat geschrieben:
Hyperion hat geschrieben:Zwischen Deinem Ansatz und einer Klasse bleibt... *Trommelwirbel* eine Funktion ;-)
Haha, genau - und danke für den Trommelwirbel ;) setz mich dann am Weekend dahinter und versuche eine Funktion mit Sinn zu schreiben :)
So, ist zwar noch nicht Weekend aber dies als Funktion zu schreiben ging mir einfach nicht aus dem Kopf ;).
@Hyperion, die Funktion an sich stimmt jetzt gell? Da ich noch nichts drumherum gebaut hab nehm ich print um zu kontrollieren ob auch ein Passwort ausgespuckt wird.

Code: Alles auswählen

import random
import string

def generate_password(alphabet, length):
    return "".join(random.choice(alphabet) for _ in xrange(length))

if __name__ == "__main__":
    password = generate_password(string.ascii_letters + string.digits, 12)
    print password
Danke & Gruss
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

MGS_Freak hat geschrieben: @Hyperion, die Funktion an sich stimmt jetzt gell? Da ich noch nichts drumherum gebaut hab nehm ich print um zu kontrollieren ob auch ein Passwort ausgespuckt wird.
Jupp. So sieht das doch sauber aus :-) Und Ausgabe solltest Du eh von jeder Berechnung trennen; sprich, baue ein ``print`` nie in eine Berechnung ein (außer temporär für Debugging Zwecke natürlich).
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
MGS_Freak
User
Beiträge: 35
Registriert: Donnerstag 13. Januar 2011, 13:50
Wohnort: Schweiz

Supi danke. Ja das mit print einbauen wurde mir glaub ich schon mal von blackjack (hirn täuscht mich hoffentlich nicht) erklärt. Ach ja noch kurz von range() und xrange(), hab da kurz die doku angeschaut, versteh ich das richtig dass man bei Iterationen xrange verwendet und range nur dann wenn man explizit eine Liste hat? Danke & Grüsse
MGS_Freak
User
Beiträge: 35
Registriert: Donnerstag 13. Januar 2011, 13:50
Wohnort: Schweiz

Hello again,

habe nun das Ganze um einen kleinen Teil ergänzt :). Und zwar falls jemand aus Versehen keinen Integer eingibt kriegt er eine 2te Chance, beim 2ten mal versemmeln wird die Passwortlänge einfach standardmässig gesetzt. Fand ich gut, doch ob der Code passt:

Code: Alles auswählen

import random
import string
import time

def generate_password(alphabet, length):
    return "".join(random.choice(alphabet) for _ in xrange(length))

if __name__ == "__main__":
    for _ in xrange(2):
        try:
            length = int(raw_input("please enter the password length: "))
            break
        except ValueError:
            print "a number please or the we set de length to 8!"
    else:
        length = 8
        
    password = generate_password(string.ascii_letters + string.digits, length)
    print password
    time.wait(15)
Freue mich auf Kritik
Euer MGS_Freak
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Das ``time.wait`` am Schluss gehört da imho raus!

Im ``_main__``-Hook passiert imho zu viel. Die Eingabe der Stellenlänge solltest Du in einer Funktion kapseln; besser sogar noch in zweien, wobei die eine lediglich nach der Anzahl fragt und eine im Erfolgsfall zurück gibt und die zweite die erste dekoriert und die Beschränkung mit den zwei Versuchen einbaut.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@Malta
Dein Funktionsaufruf ist etwas gruselig... Um Zeichenbereiche, die im Passwort vorkommen dürfen anzugeben, würde ich vielleicht sowas machen:

Code: Alles auswählen

import random
import string

def generate_password(length=8, pool='ludp'):
    _pool = {'l': string.ascii_lowercase,
             'u': string.ascii_uppercase,
             'd': string.digits,
             'p': string.punctuation}
    pool = ''.join(_pool.get(selection, '') for selection in pool)
    try:
        return ''.join(random.choice(pool) for _ in xrange(length))
    except IndexError:
        raise ValueError('You must select at least one character range!')
Oder

Code: Alles auswählen

import random
import string

def generate_password(length=8, l=True, u=True, d=True, p=True):
    l = string.ascii_lowercase if l else ''
    u = string.ascii_uppercase if u else ''
    d = string.digits if d else ''
    p = string.punctuation if p else ''
    pool = ''.join((l, u, d, p))
    try:
        return ''.join(random.choice(pool) for _ in xrange(length))
    except IndexError:
        raise ValueError('You must enable at least one character range!')
mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Antworten