Python, Passwort-Generator programmieren?
Habe als kompletter Neuling mal versucht, einen Passwort-Generator in Python zu programmieren und bin auch relativ gut damit klargekommen. Jetzt will ich aber, dass das 12-stellige Passwort höchstens 3 Zahlen beinhaltet, wie kann ich das programmieren? Hier mein bisheriger Quellcode:
6 Antworten
Was alfredo153 sagt:
Mach eine For-Schleife, die jeweils ein neues Zeichen erzeugt. Dieses neue Zeichen kommt aus einem Alphabet, das deinen Regeln entsprechend zusammengesetzt wird.
Z.B. wenn das erste Zeichen eine Zahl sein muss, dann nimm für das erste Zeichen nur Zahlen, aus denen Du zufällig auswählst.
Bei der Regel, wie viele Zahlen im Passwort sein dürfen, tust Du nur Zahlen ins Alphabet, solange keine 3 Zahlen im Passwort sind.
Um meine vorige Antwort zu illustrieren, eine schnell hingeklopfte Lösung, die man sicher verschönern kann:
import string
import random
vowels = set('AEIOU')
consonants = set(string.ascii_uppercase) - vowels
digits = set(string.digits)
def gen_pw(len = 0, digits_used = 0, consonants_seq = 0):
alphabet = vowels | (digits if digits_used < 3 else set()) | (consonants if not consonants_seq >= 3 else set())
picked = random.choice(tuple(alphabet))
if len == 11:
return picked
else:
return picked + gen_pw(len+1, digits_used + (1 if picked in digits else 0), consonants_seq + 1 if picked in consonants else 0)
print(gen_pw())
Das ist rekursiv gelöst, kann aber genausogut als Iteration mit einer for-Schleife über eine 12er-Range gemacht werden. Der entscheidende Punkt ist, dass für jeden Durchlauf das verfügbare Alphabet neu aufgebaut wird: sind Konsonanten erlaubt, sind Ziffern erlaubt? Dafür gibt es die Zähler (digits_used, consonants_seq). Analog könnten weitere Regeln leicht eingebaut werden.
Ich würde das so machen
import string
from random import randint, choice
l = string.ascii_letters
d = string.digits
#z ist die Anzahl an Zahlen die dann später im Passwort vorkommen (0-3)
z = randint(0,3)
pw = [choice(l) for i in range(12-z)]
[pw.insert(randint(0,12), choice(d)) for i in range(z)]
pw = ''.join(pw)
print(pw)
Trotzdem interessanter Ansatz. Das ist die Sorte von Übung, bei der man immer wieder kreative neue Lösungen von anderen lernen kann. :)
Hier nochmal eine Korrektur
import string
from random import randint, choice
l = string.ascii_letters
d = string.digits
cons = "bcdfghjklmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ"
pw = []
z = randint(0,3)
for i in range(12-z):
c = choice(l)
if(i > 2):
while(pw[i-1] in cons and pw[i-2] in cons and pw[i-3] in cons and c in cons):
c = choice(l)
pw += [c]
[pw.insert(randint(0,12), choice(d)) for i in range(z)]
pw = ''.join(pw)
print ("Dein random Passwort lautet:",pw)
Hi, hab noch ne Lösung :)
## Passwort Generator mit maximal x Zahlen
import string
import random
x = 3
letters = list(string.ascii_lowercase)
numbers = string.digits
i = 0
passwort = []
while i < x:
passwort.append(random.choice(numbers))
i = i +1
while i < 12:
passwort.append(random.choice(letters))
random.shuffle(passwort)
i = i + 1
pw = "".join(passwort)
print ("Dein random Passwort lautet:",pw)
Da fehlt, wie bei meiner Lösung, die Bedingung nicht mehr als 3 Konsonanten hintereinander und x muss nur <= 3 sein. X kann also auch die Werte 0,1,2 annehmen und somit müsste x = random.randint(0,3) und while i < 12 while i < 12-x lauten
import string
import random
letters = string.ascii_letters
numbers = string.digits
i = 0
passwort = []
while i < 12:
passwort.append(random.choice(letters))
i = i+1
if i == 3:
passwort.append(random.choice(numbers))
if i == 6:
passwort.append(random.choice(numbers))
if i == 9:
passwort.append(random.choice(numbers))
pw = "".join(passwort)
print ("Dein random Passwort lautet:",pw)
Gibt der Code nicht immer noch genau 3 Zahlen beim fertigen Passwort aus?
Wenn die Aufgabe ist, nach jeden 3 Buchstaben eine Zahl kommen muss , ja, geht ja nicht anders bei 12 zeichen?
War die aufgabe nicht höchsten 3 Zahlen?
Jedenfalls hier mein verbesserter code mit Konsonanten usw.
Den habe ich jetzt auch mal erfolgreich mit 10000 Pws auf max. 3 Konsonanten in Reihe getestet
import string
from random import randint, choice
l = string.ascii_letters
d = string.digits
cons = "bcdfghjklmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ"
pw = []
z = randint(0,3)
for i in range(12-z):
c = choice(l)
if(i > 2):
while(pw[i-1] in cons and pw[i-2] in cons and pw[i-3] in cons and c in cons):
c = choice(l)
pw += [c]
[pw.insert(randint(0,12), choice(d)) for i in range(z)]
pw = ''.join(pw)
print ("Dein random Passwort lautet:",pw)
Keine Ahnung was du meinst, glaub wir reden aneinander vorbei.
Hätte Lust auf weitere Coding Challenges. Wo findet man sowas :p
Habe auch keine guten Quellen bis jetzt. Was ich aber manchmal mache sind die von codewars.
Du generierst erst eine Liste von 3 Zufallszahlen (bzw. Ziffern) und entnimmst diese. Geht auch bequem mit .pop().
Generell ist dein Vorgehen etwas verschwenderisch - du probierst es so lange, bis es endlich klappt. Sinnvoller wäre, den Zielstring aus bekannten Elementen nach deinen Regeln zusammenzuwürfeln.
Das Ganze ist im Wesentlichen eine Zustandsmaschine: für jeden Schritt gibt es eine andere Menge von zulässigen Zeichen. Hast du in den letzten 2 Schritten Konsonanten verwendet, ist diese Menge einmalig um die Untermenge der Konsonanten zu reduzieren.
Da fehlt allerdings die Regel "nicht mehr als 3 Konsonanten in einer Reihe".