Wskazówki: sprawdzanie poprawności złożoności haseł (Visual Basic)

Ta metoda sprawdza niektóre cechy silnego hasła i aktualizuje parametr ciągu z informacjami o tym, które sprawdzanie hasła kończy się niepowodzeniem.

Hasła mogą być używane w bezpiecznym systemie do autoryzowania użytkownika. Jednak hasła muszą być trudne do odgadnięcia przez nieautoryzowanych użytkowników. Osoby atakujące mogą używać programu do ataków słownika, który iteruje wszystkie wyrazy w słowniku (lub wielu słownikach w różnych językach) i sprawdza, czy dowolny wyraz działa jako hasło użytkownika. Słabe hasła, takie jak "Yankees" lub "Mustang", można szybko odgadnąć. Silniejsze hasła, takie jak "? L1N3vaFiNdMeyeP@sSWerd!", jest znacznie mniej prawdopodobne, aby odgadnąć. System chroniony hasłem powinien zapewnić, że użytkownicy wybierają silne hasła.

Silne hasło jest złożone (zawierające kombinację wielkich liter, małych liter, liczb i znaków specjalnych) i nie jest słowem. W tym przykładzie pokazano, jak zweryfikować złożoność.

Przykład

Kod

''' <summary>Determines if a password is sufficiently complex.</summary>
''' <param name="pwd">Password to validate</param>
''' <param name="minLength">Minimum number of password characters.</param>
''' <param name="numUpper">Minimum number of uppercase characters.</param>
''' <param name="numLower">Minimum number of lowercase characters.</param>
''' <param name="numNumbers">Minimum number of numeric characters.</param>
''' <param name="numSpecial">Minimum number of special characters.</param>
''' <returns>True if the password is sufficiently complex.</returns>
Function ValidatePassword(ByVal pwd As String, 
    Optional ByVal minLength As Integer = 8, 
    Optional ByVal numUpper As Integer = 2, 
    Optional ByVal numLower As Integer = 2, 
    Optional ByVal numNumbers As Integer = 2, 
    Optional ByVal numSpecial As Integer = 2) As Boolean

    ' Replace [A-Z] with \p{Lu}, to allow for Unicode uppercase letters.
    Dim upper As New System.Text.RegularExpressions.Regex("[A-Z]")
    Dim lower As New System.Text.RegularExpressions.Regex("[a-z]")
    Dim number As New System.Text.RegularExpressions.Regex("[0-9]")
    ' Special is "none of the above".
    Dim special As New System.Text.RegularExpressions.Regex("[^a-zA-Z0-9]")

    ' Check the length.
    If Len(pwd) < minLength Then Return False
    ' Check for minimum number of occurrences.
    If upper.Matches(pwd).Count < numUpper Then Return False
    If lower.Matches(pwd).Count < numLower Then Return False
    If number.Matches(pwd).Count < numNumbers Then Return False
    If special.Matches(pwd).Count < numSpecial Then Return False

    ' Passed all checks.
    Return True
End Function

Sub TestValidatePassword()
    Dim password As String = "Password"
    ' Demonstrate that "Password" is not complex.
    MsgBox(password & " is complex: " & ValidatePassword(password))

    password = "Z9f%a>2kQ"
    ' Demonstrate that "Z9f%a>2kQ" is not complex.
    MsgBox(password & " is complex: " & ValidatePassword(password))
End Sub

Kompilowanie kodu

Wywołaj tę metodę, przekazując ciąg zawierający to hasło.

Ten przykład wymaga:

Zabezpieczenia

Jeśli przenosisz hasło w sieci, musisz użyć bezpiecznej metody do przesyłania danych. Aby uzyskać więcej informacji, zobacz ASP.NET Web Application Security.

Dokładność funkcji można poprawić ValidatePassword , dodając dodatkowe kontrole złożoności:

  • Porównaj hasło i jego podciągy z nazwą użytkownika, identyfikatorem użytkownika i słownikiem zdefiniowanym przez aplikację. Ponadto podczas przeprowadzania porównań traktuj wizualnie podobne znaki jako równoważne. Na przykład należy traktować litery "l" i "e" jako równoważne cyfrom "1" i "3".

  • Jeśli istnieje tylko jedna wielka litera, upewnij się, że nie jest to pierwszy znak hasła.

  • Upewnij się, że ostatnie dwa znaki hasła to znaki litery.

  • Nie zezwalaj na hasła, w których wszystkie symbole są wprowadzane z górnego wiersza klawiatury.

Zobacz też