Überprüfen ob eine Zahl vorhanden ist.

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Traubensaftx34
User
Beiträge: 5
Registriert: Freitag 16. September 2022, 21:42

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)
 
Benutzeravatar
__blackjack__
User
Beiträge: 13071
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
__blackjack__
User
Beiträge: 13071
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten