Python, Passwort-Generator programmieren?

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)
Woher ich das weiß:Studium / Ausbildung – Informatikstudent
alfredo153  27.10.2020, 09:04

Da fehlt allerdings die Regel "nicht mehr als 3 Konsonanten in einer Reihe".

1
alfredo153  27.10.2020, 09:08
@whgoffline

Trotzdem interessanter Ansatz. Das ist die Sorte von Übung, bei der man immer wieder kreative neue Lösungen von anderen lernen kann. :)

1
whgoffline  27.10.2020, 18:37
@alfredo153

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)
0

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)
whgoffline  27.10.2020, 16:28

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

0
sitgo93  27.10.2020, 17:34
@whgoffline
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)
0
whgoffline  27.10.2020, 18:15
@sitgo93

Gibt der Code nicht immer noch genau 3 Zahlen beim fertigen Passwort aus?

0
sitgo93  27.10.2020, 18:31
@whgoffline

Wenn die Aufgabe ist, nach jeden 3 Buchstaben eine Zahl kommen muss , ja, geht ja nicht anders bei 12 zeichen?

0
whgoffline  27.10.2020, 18:33
@sitgo93

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)
0
sitgo93  27.10.2020, 18:42
@whgoffline

Keine Ahnung was du meinst, glaub wir reden aneinander vorbei.
Hätte Lust auf weitere Coding Challenges. Wo findet man sowas :p

1
whgoffline  27.10.2020, 18:44
@sitgo93

Habe auch keine guten Quellen bis jetzt. Was ich aber manchmal mache sind die von codewars.

0

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.

alfredo153  27.10.2020, 09:00

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.

1