Clever-Excel-Forum

Normale Version: Passwort aus Zahlen und Buchstaben
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2 3
Hallo zusammen :)


Ich habe in einer Excel Datei ein UserForm erstellt was einer Erstellung eines Benutzerkontos gleicht.

Der Benutzer muss neben seinem Namen auch ein Passwort eingeben. Nun soll in der TextBox für die Passworterstellung folgendes überprüft werden:

1. Ist das Passwort mindestens 6 Zeichen lang
2. Wurde mindestens ein Grossbuchstabe.
3. Wurde mindestens eine Zahl verwendet.
4. Wurden keine Zeichen wie "äüöœæ" oder ähnliches verwendet.

Bei Punkt Nr. 1würde ich es wie folgt lösen

Code:
If Len(TextBox1) < 6 Then
MsgBox "Passwort zu kurz"
End If


Für die anderen 3 Punkte fehlt mir der richtige Ansatz. Würdet Ihr den Inhalt der TextBox mit der Funktion .Find überprüfen oder gibt es bereits, mir noch unbekannte Funktionen, die das übernehmen?

Gibt es die Möglichkeit jeden Buchstaben in der TextBox einzeln nach diesen Kriterien zu untersuchen? Nach dem Motto For Each Char/Symbol?

Lg Primo
Moin Centurio,

Mein Ansatz:

Erst einmal vereinfachen: Deine drei Kriterien sind die Länge des PWs, dann darf man nur noch Ziffern und Großbuchstaben, Die Umlaute brauchst Du nicht extra auszugrenzen.
Die Länge hast du schon. 
Für die nächsten Kriterien kannst Du das Passwort Zeichenweise prüfen, ob das Zeichen im ASCII-Bereich 60-95 (Großbuchstaben) und/oder 46-57 (Ziffern) liegt. VBA: ASC(Zeichen)
Abschließend musst Du sicherstellen, dass beide Zeichentypen vorhanden sind.

Viel Spaß!
Moin Centurio,

aus purer Langeweile ... quatsch! Der Spaß am Lernen begründet mein Hiersein! habe ich Dir mal was gebastelt und Dich dabei absichtlich missverstanden. Schließlich fehlte Dir nur der Einstieg...

Code:
Option Explicit

Sub PWCheck()
Dim i As Integer, f As Integer, iNum As Integer, iChar As Integer
Dim sPW As String, sChar As String, sCheck As String, sMsg As String

sPW = Cells(1, 1)

' Ziffern & Großbuchstaben?
For i = 1 To Len(sPW)
    sChar = Mid(sPW, i)
    If Asc(sChar) > 46 And Asc(sChar) < 57 Then 'Ziffern
        sCheck = sCheck & "Z"
    End If
    If Asc(sChar) > 64 And Asc(sChar) < 91 Then 'Großbuchstaben
        sCheck = sCheck & "G"
    End If
Next i

' Werte Regelkonform?
For i = 1 To Len(sCheck)
    If Mid(sCheck, i, 1) = "G" Then
        iNum = iNum + 1
    End If
    If Mid(sCheck, i, 1) = "Z" Then
        iChar = iChar + 1
    End If
Next i

' Länge okay, beide Werttypen vorhanden?
Select Case True
    Case Len(sPW) < 6, iNum = 0, iChar = 0, iNum + iChar <> Len(sPW)
        sMsg = vbTab & "Fehler!" & vbNewLine & vbNewLine & _
        "Passwort-Regel beachten:" & vbNewLine & _
        "Mix aus Großbuchstaben und Ziffern" & vbNewLine & _
        "Mindestlänge sechs Zeichen."
    Case Else
        sMsg = "Passt alles!"
End Select
'Ausgabe
MsgBox sMsg, , "Checked!"

End Sub

Was ist das Missverständnis? Tipp: 97-122 ... Du wirst es finden und dann sicherlich selbst anpassen können. 21

Viel Erfolg!

noch einen als Nachtrag zum Thema Passwörter in XL: Ich hoffe, Du folgst nicht Illusion, dass man XL-Dateien tatsächlich 100%ig schützen könnte? Egal, ob Workbook, Worksheet oder VBA-Code. Es ist alles nix mit Fort Knox!!

Grüße
(07.09.2022, 18:57)Primo Centurio schrieb: [ -> ]4. Wurden keine Zeichen wie "äüöœæ" oder ähnliches verwendet.
Welche Zeichen aus der schier unendlichen Massen an möglichen Zeichen erfüllen nach deiner Definition das Kriterium "ähnlich wie 'äüöœæ'"?
Oder anders herum: Welche Zeichen erfüllen dieses Kriterium nicht?
Aus der Erkenntnis, was du einfacher beantworten kannst, kannst du Rückschlüsse ziehen, wie du deine programmierte Lösung aufbauen solltest, also: Prüfst du auf gültige Zeichen oder auf ungültige?

2 Ideen:
Code:
Option Explicit

Function chkPwd(ByVal Password As String) As Boolean
'1. Ist das Passwort mindestens 6 Zeichen lang
'2. Wurde mindestens ein Grossbuchstabe.
'3. Wurde mindestens eine Zahl verwendet.
'4. Wurden keine Zeichen wie "äüöœæ" oder ähnliches(????????????) verwendet.
Dim i As Byte

'Ohne undefinierte Bedingung 4:
If Len(Password) >= 6 Then
   If Password <> LCase(Password) Then
      For i = 1 To Len(Password)
         If IsNumeric(Mid(Password, i, 1)) Then
            chkPwd = True
            Exit For
         End If
      Next i
   End If
End If

End Function

Code:
Option Explicit

Function chkPwd2(ByVal Password As String) As Boolean
Dim i As Byte
Dim CheckSum As Byte
For i = 1 To Len(Password)
   Select Case AscW(Mid(Password, i, 1))
      Case 48 To 57                 '0-9
         CheckSum = CheckSum Or 1
      Case 65 To 90                 'A-Z
         CheckSum = CheckSum Or 2
      Case 97 To 122                'a-z
         CheckSum = CheckSum Or 4
      Case Else
         CheckSum = CheckSum Or 8
   End Select
Next i
chkPwd2 = CheckSum = (1 Or 2 Or 4)
End Function

Ideenüberschneidungen sind nicht ausgeschlossen...

Der 2. Code lässt sich einfacher an zusätzliche Bedingungen anpassen, wäre also mein Favorit.
Hallo,

der Test auf Klein- oder Großbuchstaben könnte doch auch so erfolgen, oder habe ich einen Denkfehler?

Code:
If sPW = UCase(sPW) Then
        Debug.Print "keine Kleinbuchstaben"
    End If
    If sPW = LCase(sPW) Then
        Debug.Print "keine Großbuchstaben"
    End If
(07.09.2022, 22:31)d'r Bastler schrieb: [ -> ]
Code:
    If Asc(sChar) > 46 And Asc(sChar) < 57 Then 'Ziffern
das Zeichen 47 müsstest du noch ausschließen, dafür das Zeichen 57 einbeziehen.
...sorry, aus Versehen gepostet.
Hm, mir fällt da noch ein Szenario ein, in dem der Nutzer irgendwelche (Unicode-)Sonderzeichen bewusst oder unbewusst im Passwort verwendet. Gibt er also z. B. ein Zeichen mit dem Unicodewert 0x2658 (dezimal 9816) ein, so gibt asc den Wert 63 zurück (Ersatzzeichen), also ein ggf. gültiges Zeichen. Man könnte vorsichtshalber mit CharW und AscW arbeiten.
(08.09.2022, 09:00)Der Steuerfuzzi schrieb: [ -> ]Hm, mir fällt da noch ein Szenario ein, in dem der Nutzer irgendwelche (Unicode-)Sonderzeichen bewusst oder unbewusst im Passwort verwendet. Gibt er also z. B. ein Zeichen mit dem Unicodewert 0x2658 (dezimal 9816) ein, so gibt asc den Wert 63 zurück (Ersatzzeichen), also ein ggf. gültiges Zeichen. Man könnte vorsichtshalber mit CharW und AscW arbeiten.
Wichtiger Hinweis, habe ich mal in meinen 2. Code eingebaut.
Vielen Herzlichen Dank für eure Hilfe

Werde mir heute Abend alles in Ruhe anschauen und ausprobieren :)

Ich wünsche euch einen schönen Tag und ich melde mich

Lg Primo
Seiten: 1 2 3