Passwortgenerator Python?

4 Antworten

Was ist denn genau das problem?

Wenn man nicht genau weis wie mans machen soll ist es sinvoll schrittweise vorzugehen.

Als erstes würde ich mir anschauen wie ich zufallszahlen generieren kann.

Dann schauen das ich schonmal irgendeine zufallszahl ausgeben kann.

Dann von da aus schauen wie ich es hinbekommen das die zufallszahl innerhalb eines bestimmten intervalles ist.

Die generetoren die ich aus anderen umgebungen kenne geben endweder ein int direkt aus. (man kann den bereich festlegen) oder geben ne zahl zwischen 0 und 1 aus. Dann muss man das nur einfach multiplizieren mit dem gewünschten bereich. (Kein wirklich schwieriges mathe für nötig)

Dann schauen ob man das int direkt in einen Char wandeln kann. Oder man es sich mit einer holfmethode irgendwo auslesen kann. Oder zur not selbst die möglichen werte mit irgendeiner liste zusammen mappen.

Dann nur ne schleife drumherum die die chars erzeugt und zusammenfügt.

Fertig ist das ganze.

Grundlagen wie schleifen, bedingungen (if/else), variablen, arrays etc. musst du natürlich drauf haben.

Woher ich das weiß:Studium / Ausbildung – Bachelor

Nun, die Wiederholung geht einfach über eine Schleife oder List Comprehension ...

Zur Generation: du kannst eine Zufallszahl zwischen 0 und 61 erstellen (die Menge von 10 Zahlen und 26 Zahlen (je groß und klein)

Je nachdem, wie groß die erzeugte Zufallszahl ist, wendest du einen anderen Offset an, um das darunterliegende Zeichen zu bekommen.

Alternativ erstellt du eine Liste mit allen möglichen Zeichen und wählst daraus eines aus

Also nur Kleinbuchstaben [chr(97) = 'a' bis chr(122) = 'z'] und Großbuchstaben [chr(65) = 'A' bis chr(90) = 'Z'] und Ziffern [chr(48) = '0' bis chr(57) = '9']?

Wo liegt nun genau dein Problem? Weißt du nicht, wie man eine Zufallszahl mit Python erzeugt? Kannst du zwar Zufallszahlen erzeugen, aber nicht passend für die Bereiche? Irgendein anderes Problem?

=============

Man könnte sich zunächst eine Funktion schreiben, welche eine Zufallszahl aus dem Bereich von 0 bis 61 auf eine Zahl aus der Menge [48, 57] ∪ [65, 90] ∪ [97, 122] abbildet. Beispielsweise:

def neuerBereich(k):
    if k < 10:
        return(k + 48) #bildet [0, 9] auf [48, 57] ab
    elif k < 36:
        return(k + 55) #bildet [10, 35] auf [65, 90] ab
    else:
        return(k + 61) #bildet [36, 61] auf [97, 122] ab

Dann kann man mit random.randrange(62) eine Zufallszahl im Bereich [0, 61] erzeugen, welche man dann mit der Funktion neuerBereich() auf den Bereich [48, 57] ∪ [65, 90] ∪ [97, 122] abbildet. Diese neue Zahl kann man dann in die chr()-Funktion stecken, um das entsprechende Zeichen zu erhalten.

import random
k = random.randrange(62)
k = neuerBereich(k)
print(chr(k))

Bzw. für ein Passwort mit 17 Zeichen dann insgesamt...

def neuerBereich(k):
    if k < 10:
        return(k + 48) #bildet [0, 9] auf [48, 57] ab
    elif k < 36:
        return(k + 55) #bildet [10, 35] auf [65, 90] ab
    else:
        return(k + 61) #bildet [36, 61] auf [97, 122] ab


import random
Zeichen = []
for i in range(17):
    k = random.randrange(62)
    k = neuerBereich(k)
    Zeichen.append(chr(k))
Passwort = ''.join(Zeichen)
print(Passwort)

============

Allerdings wäre es meiner Ansicht nach einfacher, wenn man einfach den Bereich der erlaubten Zeichen festlegt und dann jeweils ein zufälliges Zeichen aus diesen erlaubten Zeichen auswählt.

import string
import random
erlaubteZeichen = string.ascii_letters + string.digits
#erlaubteZeichen = 'abc...xyzABC...XYZ' + '0123456789'
Passwort = ''.join(random.choices(erlaubteZeichen, k = 17))
print(Passwort)
mihisu  05.06.2020, 18:42

Und wenn das Passwort mindestens einen Kleinbuchstaben und mindestens einen Großbuchstaben und mindestens eine Ziffer beinhalten soll, würde ich das wohl folgendermaßen lösen...

import string
import random
Zeichen = random.choices(string.ascii_lowercase) \
          + random.choices(string.ascii_uppercase) \
          + random.choices(string.digits) \
          + random.choices(string.ascii_letters + string.digits, k = 14)
random.shuffle(Zeichen)
Passwort = ''.join(Zeichen)
print(Passwort)
0
from random import randint
pw = ''.join([chr(randint(48,122)) for i in range(17)])
print(pw)

bei Fragen wie der Code funktioniert gerne schreiben ;)

Woher ich das weiß:Studium / Ausbildung – Informatikstudent
xxxcyberxxx  05.06.2020, 17:48

Das ist nicht ganz, was er wollte - denn es gibt noch Sonderzeichen in diesem Bereich.

Zudem liegt z bei 122, nicht 126

0
whgoffline  05.06.2020, 17:49
@xxxcyberxxx

die 126 habe ich bereits behoben die Sonderzeichen versuche ich gleich nochmal raus zu machen.

0
xxxcyberxxx  05.06.2020, 17:50
@whgoffline

Ich würde, wie ich bei mir geschrieben habe, das über einen Offset machen, welcher je nach generierter Zufallszahl anders ist, um in den Zahlenbereich zu kommen.

Das lässt sich in deine List Comprehension packen, wenn man die Zahl über eine eigene Methode erstellen lässt

0
whgoffline  05.06.2020, 17:55
@xxxcyberxxx

Habe mal alle erlaubten in eine liste charset geschrieben

import random as r
charset = list(range(48,57)) + list(range(65,90)) + list(range(97,122))
pw = ''.join([chr(r.choice(charset)) for i in range(17)])
print(pw)
0