Feedback

VB - Maximal Anzahl von Passwortkombinationen ermitteln

Veröffentlicht von am 11/6/2006
(6 Bewertungen)
Diese Funktion berechnet die Stärke eines Passworts und gibt die Anzahl der möglichen Kombinationen zurück
''' <summary>
''' Diese Funktion berechnet die Stärke eines Passworts und gibt die Anzahl der möglichen Kombinationen zurück
''' </summary>
''' <param name="Password">Das zu prüfende Passwort</param>
''' <remarks>Für SpecialChar nehme ich einfach mal den Wert 32 weil das ein gängiger Wert für Sonderzeichen ist</remarks>
Public Function PasswordStrength(ByVal Password As String) As Double
    Try
        If Password.Length = 0 Then Return 0
        Dim ToByte() As Byte = System.Text.Encoding.Default.GetBytes(Password)
        Dim UpperCaseAlpha As Double = 0
        Dim LowerCaseAlpha As Double = 0
        Dim Numeric As Double = 0
        Dim SpecialChar As Double = 0
        For i As Integer = 0 To ToByte.Length - 1
            If ToByte(i) >= 65 And ToByte(i) <= 90 Then UpperCaseAlpha = 26
            If ToByte(i) >= 97 And ToByte(i) <= 122 Then LowerCaseAlpha = 26
            If ToByte(i) >= 48 And ToByte(i) <= 57 Then Numeric = 10
            If Not (ToByte(i) >= 65 And ToByte(i) <= 90) And Not (ToByte(i) >= 97 And ToByte(i) <= 122) And Not (ToByte(i) >= 48 And ToByte(i) <= 57) Then SpecialChar = 32
        Next
        Return Math.Pow(UpperCaseAlpha + LowerCaseAlpha + Numeric + SpecialChar, ToByte.Length)
    Catch ex As Exception
        Return -1
    End Try
End Function
Abgelegt unter Passwort.

4 Kommentare zum Snippet

General Bison schrieb am 1/23/2009:
Wirklich cool!
Sowas hab ich schon immer gesucht ;)
Habs auchs chon lange in meinen Favoriten, bin aber NIE dazu gekommen es mal zu banutzen. ABER nu gibs auch ne wertung.
General Bison schrieb am 1/26/2009:
hab das return in


Return String.Format("{0:0}", Math.Pow(UpperCaseAlpha + LowerCaseAlpha + Numeric + SpecialChar, ToByte.Length))


geändert um der Wissenschaftlichen Zahl zu entgehen ;)
Klemens Nanni schrieb am 1/4/2011:
Wieso verwendest du den Gleitkommazahltyp, wenn ausschließlich mit Ganzzahlen gerechnet wird?
Zum einen wird im Falle eines Sonderzeichens der entsprechende Wert gleich 12 Mal -eindeutig zu oft- geprüft, zum anderen käme ein If-Else-Konstrukt dem nicht umgesetzten Auschluss-Prinzip weit mehr zu Gute.
Ich möchte einmal auf meine, so denke ich, etwas gelungerene Umsetzung im folgenden Snippet aufmerksam machen: http://dotnet-snippets.de/dns/passwortgenerator-SID1482.aspx
Koopakiller schrieb am 6/9/2016:
@Klemens
Ein Double zu verwenden macht schon Sinn. Denn der Werte Bereich eines UInt32 wäre schnell überschritten. Der eines UInt64 ist auch noch kein wirkliches Hindernis, wenn man bedenkt das bereits ein 10-zeichiges Passwort was alle Zeichen ausnutzt die 2^64-1 überschreitet.
Ein Double dagegen kann bis zu rund 10^308 als Zahl aufnehmen, wenn auch nur stark gerundet.

Wie du das mit den 12mal meinst weiß ich nicht, eine 32 kommt aber im Code vor. Und die macht schon Sinn wenn man die unzähligen Sonderzeichen bedenkt die man verwenden kann. Wenn man es drauf anlegt kommt man sogar auf um die 60 Sonderzeichen die auf einer deutschen Tastatur möglich sind.

Da die Passwortstärke eigentlich nur dann relevant wird, wenn man es mit Brute Force knacken will, ist es vor allem wichtig zu gucken welche Gruppen von Zeichen denn verwendet wurden, von daher finde ich das hier gezeigte Konzept nicht schlecht. Auch wenn man vielleicht noch zwischen Gruppen von Sonderzeichen unterscheiden könnte, da ja beispielsweise ö nicht wirklich gleich verwendet wird wie $

Als Problematisch empfinde ich die Fehlerbehandlung. Probleme gibt es wenn Password = Nothing ist. Auch finde ich das Abfangen der Exception nutzlos, eher würde ich diese hier einfach weiter "bubblen" lassen. Denn schief gehen kann eben nur ein Nothing-Passwort oder aber irgendwelche internen Fehler.
 

Logge dich ein, um hier zu kommentieren!