Benutzer muss Passwort erstellen mit Komplexitätsregeln (Großschreibung, Kleinschreibung, Zahl, Sonderzeichen) wie bei Windows

  • VBScript

Es gibt 29 Antworten in diesem Thema. Der letzte Beitrag () ist von J.Herbrich.

    Benutzer muss Passwort erstellen mit Komplexitätsregeln (Großschreibung, Kleinschreibung, Zahl, Sonderzeichen) wie bei Windows

    Hallo,

    ich habe eine Datei .hta, die als GUI dient, in die ich VBS eingebettet habe.
    Der Benutzer soll sich hiermit ein Passwort erstellen können.

    Das Passwort muss 8-stellig sein und 3 von 4 Bedingungen erfüllen:

    Großschreibung, Kleinschreibung, Zahl, Sonderzeichen

    Derzeit müssen 3 Bedingungen (Großschreibung, Kleinschreibung, Zahl) erfüllt sein.
    Leider kriege ich die Sonderzeichen nicht hin. Man kann zwar Sonderzeichen eingeben, aber leider kann ich sie nicht prüfen.

    Kann mit jemand bitte helfen?


    Der Code aus der .hta-Datei ist:

    HTML-Quellcode

    1. <html>
    2. <HEAD>
    3. <meta http-equiv="x-ua-compatible" content="ie=8" />
    4. <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    5. <HTA:APPLICATION
    6. ID="PIN n"
    7. >
    8. </HEAD>
    9. <body>
    10. <script language="vbscript">
    11. Function vbValidate()
    12. ' Passwortlänge checken
    13. Select Case (CheckStringLength(8,20,PasswordBox.value))
    14. Case 0
    15. ' Correct Length
    16. Case -1
    17. ' zu kurz
    18. errorBlock.InnerHTML = "Ihre PIN ist zu kurz!"
    19. vbValidate = False
    20. Exit Function
    21. Case 1
    22. ' zu lang
    23. errorBlock.InnerHTML = "Ihre PIN ist zu lang!"
    24. vbValidate = False
    25. Exit Function
    26. End Select
    27. </body>
    28. </html>

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „mausis“ ()

    Ich würde an Deiner Stelle in ASP keine so lange Funktion schreiben, sonder mich lieber in die mächtige Syntax der RegularExpressions (reguläre Ausdrücke) einarbeiten.
    Die Grundfunktion zu Deiner Validierung sähe dann ungefähr so aus:

    Visual Basic-Quellcode

    1. Dim myRegExp
    2. Set myRegExp = New RegExp
    3. myRegExp.Pattern = "^(?=.{12})(?![0-9])(?:(?=[^a-z]*[a-z])(?=[^0-9]*[0-9])(?=[^\-_$#]*[\-_$#])|(?=[^A-Z]*[A-Z])(?=[^0-9]*[0-9])(?=[^\-_$#]*[\-_$#])|(?=[^A-Z]*[A-Z])(?=[^a-z]*[a-z])(?=[^\-_$#]*[\-_$#])|(?=[^A-Z]*[A-Z])(?=[^a-z]*[a-z])(?=[^0-9]*[0-9]))[A-Za-z0-9-_$#]+$"
    4. If myRegExp.Test(SubjectString) Then
    5. ' Successful match
    6. Else
    7. ' Match attempt failed
    8. End If


    Jetzt nur keine Angst vor dem langen String! :thumbsup:
    Dies habe ich mir nicht eben selbst ausgedacht, sondern ein fertiges Beispiel für eine Passwort-Validierung benutzt. Die Quelle dafür ist hier: LINK

    Du siehst, die Funktion selbst ist sehr übersichtlich.
    myRegExp.Pattern enthält Deinen Regex-String unterschiedlicher Komplexität, SubjectString ist das Passwort zur Überprüfung. In den Zweigen der If-Bedingung arbeitest Du Deinen Rest ab.

    Auf der Seite, die ich verlinkt habe, steht der reguläre Ausdruck mit Kommentaren, damit man es besser versteht:
    Spoiler anzeigen

    Quellcode

    1. $re_password = '/
    2. # Match password having multiple, specific requirements.
    3. ^ # Anchor to start of string.
    4. (?=.{12}) # Password must be at least 12 characters long.
    5. (?![0-9]) # Password must not begin with a number.
    6. (?: # Password must have 3 out of 4 characteristics:
    7. # Either... Case 1: (All but R1).
    8. (?=[^a-z]*[a-z]) # R2: At least one lower case letter (a-z).
    9. (?=[^0-9]*[0-9]) # R3: At least one number (0-9).
    10. (?=[^-_$\#]*[-_$\#]) # R4: At least one of: [-_$#].
    11. | # Or... Case 2: (All but R2).
    12. (?=[^A-Z]*[A-Z]) # R1: At least one upper case letter (A-Z).
    13. (?=[^0-9]*[0-9]) # R3: At least one number (0-9).
    14. (?=[^-_$\#]*[-_$\#]) # R4: At least one of: [-_$#].
    15. | # Or... Case 3: (All but R3).
    16. (?=[^A-Z]*[A-Z]) # R1: At least one upper case letter (A-Z).
    17. (?=[^a-z]*[a-z]) # R2: At least one lower case letter (a-z).
    18. (?=[^-_$\#]*[-_$\#]) # R4: At least one of: [-_$#].
    19. | # Or... Case 4: (All but R4).
    20. (?=[^A-Z]*[A-Z]) # R1: At least one upper case letter (A-Z).
    21. (?=[^a-z]*[a-z]) # R2: At least one lower case letter (a-z).
    22. (?=[^0-9]*[0-9]) # R3: At least one number (0-9).
    23. ) # End group of 3-out-of-4 alternatives.
    24. [A-Za-z0-9-_$\#]+ # Match the password string.
    25. $ # Anchor to end of string.
    26. /x';



    Und wenn Du dann vielleicht Blut geleckt hast und Dir selbst den passenden Ausdruck generieren möchtest, gibt es unzählige Regex-Editoren - sowohl als Desktop-Version, als auch online.
    Tante google findet einige. Hier nur mal zwei online Editoren/Tester: regex101.com regexr.com/

    Gutes Gelingen! :thumbsup:

    Noch ein Nachtrag: sollte dies ein altes Projekt sein, dann bleibe ich bei meiner Ausführung, wenn Du allerdings planst, ein neues Projekt zu entwickeln, solltest Du ernsthaft überlegen, gleich auf ASP.NET umzusteigen. Dort ist die User-Authentifizierung ungleich einfacher und komfortabler.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „simpelSoft“ ()

    Hallo simpelSoft,

    zunächst vielen Dank für deine Hilfsversuche.
    Der Code ist nur ein Teil des Programms, das ich nicht mehr ändern kann. Ich muss also bei dem bleiben, was da steht.
    Es läuft soweit fehlerfrei.
    Nur die neue Bedingung (Sonderzeichen), müsste ich einbauen.
    Kann mir jemand dabei helfen?
    Ahoi,

    kann es sein, dass du von Ascii ausgehst? Dem nach konvertiert ASC in vbs aber in ANSI vielleicht liegt da dein Problem. Auf der anderen Seite würde ich es mir an deiner Stelle nochmal überlegen, nicht vielleicht doch lieber RegEx zu verwenden, da wohl auch VBS das kann. Schau mal hier.
    Grüße Manu

    Was Gott dem Menschen erspart hat, kann der Computer.
    Billy ©, (*1932), Schweizer Aphoristiker
    Quelle: www.Aphorismen.de
    @simpelSoft
    Es geht nicht um Chicke Codes. Der Code braucht keine Microsekunde für die Ausführung. Warum soll ich ihn also kürzen?
    Das was ich gepostet habe, ist nur ein Teil der Software. Da steckt also viel mehr dahinter, als es mal eben so in ASP oder wie auch immer umzuschreiben.

    @Manü
    Leider kenn ich mich mit RegEx nicht aus.

    Wie gesagt, es werden beim erstellen eines Passworts 3 Bedingungen von 3 geprüft.
    Ich brauche aber noch eine Bedingung mehr, und zwar die Sonderzeichen. Diese Bedingung habe ich zwar eingebaut, kann sie aber nicht prüfen.
    Es sollen also 3 von 4 Bedingungen erfüllt werden, anstatt wie bisher 3 von 3.
    Es geht um die Zeilen 97 bis 115, wo ich Bedingungen prüfe.
    Hat jemand an dieser Stelle eine Idee?

    Quellcode

    1. Function CheckStringLength(lowerInt, upperInt, stringValue)
    2. If Len(stringValue) < lowerInt Then
    3. CheckStringLength = -1
    4. Exit Function
    5. ElseIf Len(stringValue) > upperInt Then
    6. CheckStringLength = 1
    7. Exit Function
    8. Else
    9. CheckStringLength = 0
    10. End If
    11. End Function

    Hallo petaod,

    es sollen genau (notwendig) 3 von 4 möglichen Bedingungen erfüllt werden.
    Die mögl. Bedingungen sind: Großschreibung, Kleinschreibung, Zahl, Sonderzeichen

    3 von 3 Bedingungen kriege ich mit (If, ElseIf, Else) hin.
    Wie mache ich es bitte, wenn eine Bedingungen hinzu kommt?
    So ungefähr:

    Visual Basic-Quellcode

    1. ​Matches = 0
    2. If ContainsSpecialCharacter(...) Then Matches = Matches + 1
    3. If ContainsNumber(...) Then Matches = Matches + 1
    4. If ContainsUpperCase(...) Then Matches = Matches + 1
    5. If ContainsLowerCase(...) Then Matches = Matches + 1
    6. If Matches = 3 Then
    7. 'alles OK
    8. Else
    9. 'nicht gültig
    10. End If
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hallo petaod,

    ich verstehe die Logik deiner Idee:
    Er zählt immer 1 hinzu bis er in der Variabkle Matches die Summe 3 erreicht. Dann ist alles ok.

    Ich weiss nicht, wie ich das in VBS einbauen kann.
    Kannst du mir deine Zeilen in meinen Code einbauen?

    mausis schrieb:

    Ich weiss nicht, wie ich das in VBS einbauen kann.
    Kannst du mir deine Zeilen in meinen Code einbauen?


    Nun versuche es doch wenigstens selbst hinzukriegen, das ist ja schon peinlich.
    Deine anderen Konstrukte hast Du ja schließlich auch selbst verzapft - oder hat Dir das Jemand gemacht?
    Ich hatte es schon mehrere Stunden an der Stelle versucht, bevor ich es hier gepostet habe.
    Einiges gabs schon, einiges hab ich geändert und hinzugefügt.

    Ich bin Anfänger, lerne gern dazu, aber leider komme ich hier nicht weiter :(

    mausis schrieb:

    lerne gern dazu


    Genau DAS wage ich zu bezweifeln.
    Ich habe Dir eine fertige Routine gegeben und Du hättest lediglich den regulären Ausdruck ändern müssen (10 Minuten für Ungeübte).
    In rein spielerischer Form - völlig ohne Programmierkenntnisse (!!!) - im komfortablen Onlineeditor mit sofortigem Test.
    Also erzähl mir nicht, Du seist lernwillig.
    @simpelSoft
    Hattest du nicht geschrieben, du wärst hier raus? Warum kommst du dermaßen destruktiv zurück?

    Die Fage war, wie ich 3 von 4 Bedingungen abfrage. Hast du mal den Code überflogen und die Frage verstanden?
    Du antwortest mit RegExp und unschickem Code.
    Du hast nichts konstruktives beigetragen, sondern mir nur was neues per Copy+Paste angeboten.
    Also hast du nur gemeckert, mir 0% geholfen und deine Zeit verschwendet. Das ist Fakt.

    Mir geht es nicht um schicken Code, sondern darum, diesen Code um eine neue Bedingung zu erweitern.
    Wahrscheinlich hast nicht einmal den Code in eine HTA-Datei eingefügt, um es mal zu testen, oder?

    Also, halte dich bitte zurück mit deinen Vorwürfen.

    Das Problem scheint hier niemand lösen zu können?

    mausis schrieb:

    Du hast nichts konstruktives beigetragen, sondern mir nur was neues per Copy+Paste angeboten.
    Also hast du nur gemeckert, mir 0% geholfen und deine Zeit verschwendet. Das ist Fakt.


    Jetzt halte ich mich wirklich zurück, denn wenn mein Beitrag #2 nicht konstruktiv war, dann solltest Du Dir ein anderes Hobby suchen ^^
    Da war auch nichts mit Copy+Paste - Du hättest natürlich den Regex selbst stricken müssen.
    Brauchst nicht weiter darauf eingehen, lesen werde ich hier nicht mehr - tschüß.

    mausis schrieb:

    Hallo petaod,

    ich verstehe die Logik deiner Idee:
    Er zählt immer 1 hinzu bis er in der Variabkle Matches die Summe 3 erreicht. Dann ist alles ok.

    Ich weiss nicht, wie ich das in VBS einbauen kann.
    Kannst du mir deine Zeilen in meinen Code einbauen?


    simpelSoft schrieb:

    mausis schrieb:

    Du hast nichts konstruktives beigetragen, sondern mir nur was neues per Copy+Paste angeboten.
    Also hast du nur gemeckert, mir 0% geholfen und deine Zeit verschwendet. Das ist Fakt.


    Jetzt halte ich mich wirklich zurück, denn wenn mein Beitrag #2 nicht konstruktiv war, dann solltest Du Dir ein anderes Hobby suchen ^^
    Da war auch nichts mit Copy+Paste - Du hättest natürlich den Regex selbst stricken müssen.
    Brauchst nicht weiter darauf eingehen, lesen werde ich hier nicht mehr - tschüß.


    Sorry,du bist ja schon wieder destruktiv. :!:
    Was bringt der beste Lehrer, wenn er nichts vermittelt? Genauso handelst du.
    Schreibst mir was von RegExp und unschickem Code, obwohl es mit meiner Frage, wie ich 3 von 4 Bedingen erfülle, nichts zu tun hat.
    Du bist destruktiv, wenn ich damit nichts anfangen kann. Evtl. magst du es dich darzustellen. Du hilfst mir wirklich nicht.

    mausis schrieb:

    Schreibst mir was von RegExp und unschickem Code, obwohl es mit meiner Frage, wie ich 3 von 4 Bedingen erfülle, nichts zu tun hat.

    Doch! Hat es und zwar unbedingt!
    Dein Code ist syntaktisch sehr schlecht und lohnt nicht der Mühe, ihn zu vervollständigen.
    Darum mein Vorschlag, Deine gesamte Logik in den einen, in Deinem Fall recht kurzen, Regex auszulagern.
    Du löst alle Deine Probleme und Bedingungen in einem winzigen String.
    Die von mir vorgeschlagenen Online-Regex-Editoren machen es Dir sehr einfach und erklären jede Möglichkeit ganz genau.
    Ein einfaches Zusammenklicken Deiner Ansprüche - mehr isses nicht.
    Statt dessen machst Du hier das Opfer - Mensch, wach auf und geh doch mal ins Neuland - Du wirst staunen, was Dir das bringt.
    Nu aber, lass gut sein, lerne oder hoffe auf Hilfe der Anderen - irgend Jemand wird Deinen Code schon richten.
    Die Lösung ist in Post 9 enthalten.

    Wobei die Aufgabenstellung bestimmt beinhaltet, dass auch mehr als drei als korrekt gelten. Würde bei Passwörten Sinn machen.

    Deine Routinen packst Du dann als entsprechende Funktionen (ContainsNumber, ContainsSpecialCharacter, ContainsLowerCase, ContainsUpperCase) hinter den Code.

    Visual Basic-Quellcode

    1. dim PassWD, Matches
    2. PassWD="1kG!"
    3. Matches = 0
    4. If ContainsSpecialCharacter(PassWD) Then Matches = Matches + 1
    5. If ContainsNumber(PassWD) Then Matches = Matches + 1
    6. If ContainsUpperCase(PassWD) Then Matches = Matches + 1
    7. If ContainsLowerCase(PassWD) Then Matches = Matches + 1
    8. MsgBox "Es werden " & Matches & vbLf & "Bedingungen erfüllt.",vbInformation+vbOKOnly
    9. Function ContainsUpperCase(stringValue)
    10. If stringValue <> LCase(stringValue) Then
    11. ' Upper Case passed
    12. ContainsUpperCase = True
    13. Exit Function
    14. End If
    15. ContainsUpperCase = False
    16. End Function
    17. Function ContainsLowerCase(stringValue)
    18. ...
    19. End Function
    20. Function ContainsNumber(stringValue)
    21. ...
    22. End Function
    23. Function ContainsSpecialCharacter(stringValue)
    24. ...
    25. End Function


    Wenn es hier um Aufgaben für die Schule / etc. geht, kann es sein, dass RegEx (noch) nicht dran war.
    Gruß
    Peterfido

    Keine Unterstützung per PN!