Seite 1 von 1
kleiner Passwort Generator
Verfasst: Freitag 10. Januar 2014, 12:45
von MGS_Freak
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
Re: kleiner Passwort Generator
Verfasst: Freitag 10. Januar 2014, 12:59
von BlackJack
@MGS_Freak: Die Klasse ist total überflüssig und statt dem ``str()`` würde man eher ``''`` schreiben.
Re: kleiner Passwort Generator
Verfasst: Freitag 10. Januar 2014, 13:40
von Hyperion
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
@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?

Re: kleiner Passwort Generator
Verfasst: Freitag 10. Januar 2014, 13:41
von BlackJack
Spätestens wenn man das `*password*` aus den Methodennamen raus lässt, sollte man `pw` in `password` umbenennen.
Re: kleiner Passwort Generator
Verfasst: Freitag 10. Januar 2014, 13:48
von EyDu
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))
Re: kleiner Passwort Generator
Verfasst: Freitag 10. Januar 2014, 15:54
von MGS_Freak
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!
Re: kleiner Passwort Generator
Verfasst: Freitag 10. Januar 2014, 16:19
von Hyperion
Zwischen Deinem Ansatz und einer Klasse bleibt... *Trommelwirbel* eine Funktion

Re: kleiner Passwort Generator
Verfasst: Freitag 10. Januar 2014, 16:28
von MGS_Freak
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

Re: kleiner Passwort Generator
Verfasst: Freitag 10. Januar 2014, 16:36
von Malta
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))
Re: kleiner Passwort Generator
Verfasst: Freitag 10. Januar 2014, 17:23
von MGS_Freak
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
Re: kleiner Passwort Generator
Verfasst: Samstag 11. Januar 2014, 13:12
von Hyperion
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).
Re: kleiner Passwort Generator
Verfasst: Samstag 11. Januar 2014, 16:32
von MGS_Freak
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
Re: kleiner Passwort Generator
Verfasst: Dienstag 28. Januar 2014, 11:44
von MGS_Freak
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
Re: kleiner Passwort Generator
Verfasst: Dienstag 28. Januar 2014, 15:47
von Hyperion
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.
Re: kleiner Passwort Generator
Verfasst: Dienstag 28. Januar 2014, 17:59
von mutetella
@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