Kennworterzeugung anpassen

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.
BlackJack

@Marek06: Das ist immer noch furchtbar kompliziert und ich verstehe auch immer noch nicht was das mit `number` werden soll. Ich habe so das Gefühl das erfüllt zwar die tatsächlichen Anforderungen, schränkt aber deutlich zu stark ein. Was sind denn die Einschränkungen? Sinn machen würde 8 Zeichen und dabei mindestens ein Zeichen aus den Gruppen Kleinbuchstaben, Grossbuchstaben, Ziffern, Sonderzeichen (Interpunktion). Da gäbe es aber deutlich mehr Möglichkeiten als Dein Code erzeugt, der wäre dann also unnötig einschränkend. Und wie gesagt: Zu kompliziert.

Edit:

Code: Alles auswählen

def generate_password(length=8):
    groups = [
        string.lowercase, string.uppercase, string.digits, string.punctuation
    ]
    result = [random.choice(g) for g in groups]
    all_characters = ''.join(groups)
    result.extend(
        random.choice(all_characters) for _ in range(length - len(result))
    )
    random.shuffle(result)
    return ''.join(result)[:length]
Sirius3
User
Beiträge: 18320
Registriert: Sonntag 21. Oktober 2012, 17:20

Warum erzeugst Du erst Listen von Strings, dann einen String um dann wieder daraus eine Liste zu machen (es gibt übrigens »list« dafür)?

Wenn man alles zusammenfasst, kommt ungefähr das raus:

Code: Alles auswählen

import string
import random

def generate_password(length):
    sets = [string.uppercase, string.lowercase, string.digits, string.punctuation]
    sets2 = [''.join(sets[:-1])]+random.sample(sets + [''.join(sets)]*(length-len(sets)-1), length-1)
    return ''.join(map(random.choice, sets2))
Marek06
User
Beiträge: 13
Registriert: Dienstag 17. April 2012, 08:51

Folgende Konventionen sind gefordert:

1. Das 1 Zeichen darf nur Großbuchstabe, Kleinbuchstabe, Zahl sein
2. Genau 8 Zeichen
3. Insgesamt muss im Kennwort 1 Kleinbuchstabe, Großbuchstabe, Zahl, Zeichen vorhanden sein

Mit dem Attribut 'number' wollte ich sicher, dass ich z.B nicht festlege - immer 3 Großbuchstabe oder 3 Kleinbuchstaben oder 3 Zahlen - sondern das jedesmal variable erzeugt wird. Und mit der 2 Liste wollte ich sicher gehen, dass alle 7 Zeichen und nicht die Blöcke gemischt werden (außer das 1 Zeichen).

Die anderen Lösungen sehen auf jeden Fall kürzer und besser aus. :) :)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Marek06 hat geschrieben:Mit dem Attribut 'number' wollte ich sicher, dass ich z.B nicht festlege - immer 3 Großbuchstabe oder 3 Kleinbuchstaben oder 3 Zahlen - sondern das jedesmal variable erzeugt wird. Und mit der 2 Liste wollte ich sicher gehen, dass alle 7 Zeichen und nicht die Blöcke gemischt werden (außer das 1 Zeichen).
Die Intention hinter deinem Gedanken ist schon klar, du hast dir bei deiner Umsetzung nur nicht genügend Gedanken über die Folgen gemacht. Durch deinen Ansatz gehen nämlich unglaublich viele Kombinationen verloren, welche sonst möglich wären. Und damit werden deine Kennwörter viel leichter vorhersagbar.

Vielleicht einfach an einem Beispiel. Angenommen du hast zwei Mengen von Zeichen: die Menge N mit n verschiedenen Zeichen und die Menge M mit m verschiedenen Zeichen. Das Kennwort soll mindestens 5 Zeichen lang sein und mindestens eine Zeichen aus M und aus N enthalten. Wählt man die Verteilung bei dir, so könnte man einfach sagen: gut 3 Zeichen für n und zwei Zeichen für m oder umgekehrt. Damit hast du dann n³+m² + n²+m³ mögliche Kombinationen dabei vergisst du aber, dass noch n+m⁴, und n⁴+m möglich sind. Das sieht jetzt auf den ersten Blick nicht nach viel aus, aber in diesem Fall würdest du einfach mal einen riesigen Batzen an Möglichkeiten wegwerfen. Bereits bei relativ kleinen n und m werden n⁴ und m⁴ deutlich größer als n³+m² + n²+m³ und dominieren vollständig. D.h., du verlierst die überwiegenden Anteil an Kombinationen. Wenn jemand die Verteilung der Anzahlen kennt, dann ist es ein Leichtes die Kennwörter zu raten.
Das Leben ist wie ein Tennisball.
Antworten