Seite 1 von 1

Überprüfen ob eine Zahl vorhanden ist.

Verfasst: Montag 27. Februar 2023, 17:12
von Traubensaftx34
Hallo Leute, ich habe die Aufgabe ein Passwortgenerator zur erstellen. Die Voraussetzungen sind Groß- und kleinschreibung, Sonderzeichen und Zahlen. chr(94) soll bewusst nicht enthalten sein.
So wie es jetzt ist funktioniert alles das einzige was fehlt sind zahlen. Es kommen zwar zahlen aber natürlich nur Random. Wie kann ich sicher gehen das das Passwort am Ende eine Zahl von 0-9 enthält? Ich habe schon einiges ausprobiert aber komme nie zum Ergebnis. Liebe Grüße

Code: Alles auswählen

Import string
Import random

string1 = string.ascii_lowercase
string2 = string.ascii_uppercase
string3 = string.digits
string4 = string.punctuation

length = 8

s = []
s.extend(list(string1))
s.extend(list(string2))
s.extend(list(string3))
s.extend(list(string4))

password = ””.join(random.sample(s, length))

while chr(94) in password: 
        password = ””.join(random.sample(s, length))

        while password.isupper() or password.islower() or  
        password.isalpha():
                  password = ””.join(random.sample(s, length))
                  
 print(”Your Password is:  ” + password)
 

Re: Überprüfen ob eine Zahl vorhanden ist.

Verfasst: Montag 27. Februar 2023, 17:39
von __blackjack__
@Traubensaftx34: Das ist so nie gelaufen, weil das schon in der ersten Zeile einen Syntaxfehler enthält, so dass das nicht einmal am Compiler vorbei kommt.

Man nummeriert keine Variablennamen. Die `string1` bis `string4` sind auch überflüssig genau wie die `list()`-Aufrufe, weil man gleich die Zeichenketten an die `extend()`-Methode übergeben kann.

Einbuchstabige Namen sind sehr selten gute Namen. Namen sollen dem Leser verraten was der Wert dahinter im Kontext des Programms bedeutet. `s` tut das sicher nicht.

`random.sample()` ist ziemlich sicher die falsche Funktion, denn die schliesst aus, dass ein Zeichen mehr als einmal vorkommt, und damit wird der Suchraum für Angreifer kleiner.

Statt "^" ``chr(94)`` zu schreiben ist ein bisschen albern und macht das auch schwerer verständlich weil nicht jeder so aus dem FF weiss welches Zeichen das ist.

Wenn Zeichen nicht im Ergebnis enthalten sein soll, dann würfelt man nicht so lange Passwörter aus bis das der Fall ist, sondern packt diese(s) Zeichen gar nicht erst in die Auswahl.

Ähnliches gilt für die anderen Bedingungen. Statt so lange Passwörter zu generieren bis die Bedingungen passen, schreibt man Code der gleich ein passendes Passwort generiert.

Eine Ziffer immer am Ende will man auch nicht, denn auch das schränkt wieder den Suchraum für Angreifer ein.

Re: Überprüfen ob eine Zahl vorhanden ist.

Verfasst: Mittwoch 15. März 2023, 12:10
von __blackjack__
Ein Ansatz:

Code: Alles auswählen

#!/usr/bin/env python3
import random
from string import ascii_letters, ascii_uppercase, digits, punctuation


def main():
    length = 8
    character_groups = [
        ascii_letters,
        ascii_uppercase,
        digits,
        punctuation.replace("^", ""),
    ]
    characters = [random.choice(group) for group in character_groups]
    characters.extend(
        random.choices("".join(character_groups), k=length - len(characters))
    )
    random.shuffle(characters)
    password = "".join(characters)
    if len(password) > length:
        password = password[:length]
    print(password)


if __name__ == "__main__":
    main()