Kennwörter generieren

Für den einen oder anderen Zweck möchten Sie vielleicht Kennwörter generieren oder in einer Benutzeroberfläche die Möglichkeit zum Generieren von Kennwörtern anbieten. Wenn Sie etwa Benutzer zu einer Benutzerverwaltung hinzufügen, sollten Sie ein initiales Kennwort definieren, das der Benutzer dann bei der ersten Anmeldung ändert. Das Generieren von Kennwörtern wird allerdings umso komplizierter, je mehr Anforderungen es gibt. Einfach nur ein paar Zeichen zufällig auszuwählen, ist noch einfach, aber wenn es Bedingungen gibt, wie sie in sensiblen Umgebungen vorherrschen, soll ein Kennwort beispielsweise mindestens einen Kleinbuchstaben, einen Großbuchstaben, eine Zahl und ein Sonderzeichen enthalten. Diese Anforderungen wollen wir in der hier vorgestellten Funktion natürlich auch unterstützen.

Kennwort mit bestimmter Zeichenanzahl

Die einfachste Variante ermittelt einfach ein Kennwort mit beliebigen Zeichen aus einem bestimmten Zeichenpool, wobei wir mit dem einzigen Parameter der Funktion namens KennwortGenerierenEinfach die Anzahl der Zeichen angeben (siehe Listing 1).

Public Function KennwortGenerierenEinfach(intLaenge As Integer)
     Const strZeichen As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!""§$%&()[]{}\**#:;,.-+<>"
     Dim strKennwort As String
     Dim i As Integer
     Randomize
     For i = 1 To intLaenge
         strKennwort = strKennwort & Mid(strZeichen, Fix(Len(strZeichen) * Rnd) + 1, 1)
     Next
     KennwortGenerierenEinfach = strKennwort
End Function

Listing 1: Generieren eines einfachen Kennworts

Die Funktion definiert eine Konstante, die alle vorgesehenen Zeichen enthält – in diesem Fall alle Großbuchstaben, alle Kleinbuchstaben, alle Zahlen und einige Sonderzeichen:

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!""§$%&()[]{}\**#:;,.-+<>

Nach der Definition der beiden übrigen Variablen strKennwort zum Speichern des zusammengesetzten Kennworts und i als Laufvariable der For Next-Schleife initialisiert die Funktion mit der Randomize-Funktion den Zufallszahlengenerator.

Die Rnd-Funktion, die eine Zufallszahl ermittelt, liefert nämlich sonst nach jedem neuen Start der Access-Anwendung die gleichen Ergebnisse. Sie können das ausprobieren, indem Sie im Direktbereich die Rnd-Funktion wie folgt aufrufen:

Debug.Print Rnd()
  0,7055475 

Nach dem Schließen und erneutem öffnen der Anwendung erhalten Sie mit dem Aufruf der Rnd()-Funktion auch das gleiche Ergebnis. Wenn Sie jedoch zuvor einmal die Randomize-Anweisung aufrufen, wird die Rnd()-Funktion auf Basis der Timer()-Funktion initialisiert und liefert somit immer andere Werte.

In der For…Next-Schleife durchlaufen wir die Zahlen von 1 bis zu der mit dem Parameter intLaenge angegebenen Zeichenzahl. In der einzigen Anweisung innerhalb der Schleife fügen wir der Variablen strKennwort jeweils ein zufällig aus der Konstanten strZeichen ausgewähltes Zeichen aus. Damit die Funktion Rnd() auch genau einen der Werte von 1 bis 87 liefert, was dem ersten und dem letzten Zeichen der Konstanten strZeichen entspricht, multiplizieren wir das Ergebnis der Rnd()-Funktion, das immer einen Wert zwischen 0 und 1 liefert, mit der Anzahl der Zeichen, runden das Ergebnis und addieren dann den Wert 1 hinzu. Die Mid-Funktion ermittelt dann genau den Wert mit der angegebenen Position aus der Zeichenkette strZeichen.

Kennwort mit bestimmten Anforderungen

Nun bauen wir eine weitere, etwas leistungsfähigere Variante der Funktion. Diese erhält vier weitere Parameter mit dem Datentyp Boolean, die wie folgt heißen:

  • bolGrossbuchstaben: Gibt an, ob das Kennwort Großbuchstaben enthalten soll.
  • bolKleinbuchstaben: Gibt an, ob das Kennwort Kleinbuchstaben enthalten soll.
  • bolZahlen: Gibt an, ob das Kennwort Zahlen enthalten soll.
  • bolSonderzeichen: Gibt an, ob das Kennwort Sonderzeichen enthalten soll.

Die vier Parameter legen also fest, aus welchen Zeichen das Kennwort bestehen soll.

Abhängig von den Angaben beim Aufruf wird die Ermittlung des Kennwort etwas aufwendiger, denn: Wir wollen nicht etwa die verschiedenen angeforderten Zeichen an einer bestimmten Stelle zurückgeben.

Das wäre einfach: Dann könnten wir zu Beginn einen Großbuchstaben wählen, dann einen Kleinbuchstaben, eine Zahl und schließlich ein Sonderzeichen und den Rest der angeforderten Zeichen für das Kennwort mit beliebigen Zeichen.

Die angeforderten Elemente, also Groß- und Kleinbuchstaben, Zahlen und Sonderzeichen, sollen in beliebiger Reihenfolge im Kennwort auftauchen. Das in einen Algorithmus zu fassen, ist mit etwas Denkarbeit verbunden.

Wir haben uns für den folgenden Ansatz entschieden: Wir starten mit einer Zeichenfolge als Kennwort, die ausschließlich Leerzeichen enthält. Dann prüfen wir die vier Boolean-Parameter und fügen an zufällig ausgewählte Stellen die geforderten Zeichen hinzu. Schließlich füllen wir die noch leeren Stellen mit Zeichen aus dem kompletten Pool auf.

Den Ansatz finden Sie in der Funktion KennwortGenerieren, deren ersten Teil wir in Listing 2 abgebildet haben. Hier finden Sie zunächst die Parameterliste, die aus der Anzahl der gewünschten Zeichen und den vier bereits beschriebenen Parametern besteht. Alle Parameter sind optional und erhalten den Wert True, wenn sie beim Aufruf nicht angegeben werden.

Public Function KennwortGenerieren(intLaenge As Integer, Optional bolGrossbuchstaben As Boolean = True, _
         Optional bolKleinbuchstaben As Boolean = True, Optional bolZahlen As Boolean = True, _
         Optional bolSonderzeichen As Boolean = True)
     Const strGrossbuchstaben As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
     Const strKleinbuchstaben As String = "abcdefghijklmnopqrstuvwxyz"
     Const strZahlen As String = "0123456789"
     Const strSonderzeichen As String = "!""§$%&()[]{}\**#:;,.-+<>"
     Dim strZeichen As String
     Dim strKennwort As String
     Dim intPositionZufall As Integer
     Dim strZeichenZufall As String
     Dim i As Integer
     Dim intZeichen As Integer
     intZeichen = Abs(bolGrossbuchstaben) + Abs(bolKleinbuchstaben) + Abs(bolZahlen) + Abs(bolSonderzeichen)
     If intLaenge < intZeichen Then
         MsgBox "Die Länge muss mindestens " & intZeichen & " Zeichen betragen."
         Exit Function
     End If
     strKennwort = Space(intLaenge)
     Randomize
     If bolGrossbuchstaben = True Then
         intPositionZufall = Fix(intLaenge * Rnd) + 1
         strZeichenZufall = Mid(strGrossbuchstaben, Fix(Len(strGrossbuchstaben) * Rnd) + 1, 1)
         strKennwort = Left(strKennwort, intPositionZufall - 1) & strZeichenZufall & Mid(strKennwort, intPositionZufall + 1)
         strZeichen = strZeichen & strGrossbuchstaben
     End If
     Do While bolKleinbuchstaben = True
         intPositionZufall = Fix(intLaenge * Rnd) + 1
         If Mid(strKennwort, intPositionZufall, 1) = " " Then
             strZeichenZufall = Mid(strKleinbuchstaben, Fix(Len(strKleinbuchstaben) * Rnd) + 1, 1)
             strKennwort = Left(strKennwort, intPositionZufall - 1) & strZeichenZufall & Mid(strKennwort, _
                 intPositionZufall + 1)
             bolKleinbuchstaben = False
             strZeichen = strZeichen & strKleinbuchstaben
         End If
     Loop
     Do While bolZahlen = True
         intPositionZufall = Fix(intLaenge * Rnd) + 1
         If Mid(strKennwort, intPositionZufall, 1) = " " Then
             strZeichenZufall = Mid(strZahlen, Fix(Len(strZahlen) * Rnd) + 1, 1)
             strKennwort = Left(strKennwort, intPositionZufall - 1) & strZeichenZufall & Mid(strKennwort, _
                 intPositionZufall + 1)
             bolZahlen = False
             strZeichen = strZeichen & strZahlen
         End If
     Loop

Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins Access im Unternehmen:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 1.000 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:

Schreibe einen Kommentar