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:
- Dostęp do członków System.Text.RegularExpressions przestrzeni nazw. Dodaj instrukcję
Imports
, jeśli nie masz w pełni kwalifikowanych nazw członków w kodzie. Aby uzyskać więcej informacji, zobacz Import Statement (.NET Namespace and Type).
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.