Поделиться через


Пошаговое руководство. Проверка паролей на сложность (Visual Basic)

Этот метод проверка для некоторых характеристик надежных паролей и обновляет строковый параметр со сведениями о том, какие проверка пароль завершается ошибкой.

Пароли можно использовать в безопасной системе для авторизации пользователя. Однако пароли должны быть трудными для неавторизованных пользователей. Злоумышленники могут использовать программу атаки на словарь, которая выполняет итерацию всех слов в словаре (или нескольких словарях на разных языках) и проверяет, работают ли какие-либо слова в качестве пароля пользователя. Слабые пароли, такие как "Янкиз" или "Mustang", можно быстро угадать. Более надежные пароли, такие как "? Вы L1N3vaFiNdMeyeP@sSWerd!", гораздо менее вероятно, будет догадываться. Система, защищенная паролем, должна гарантировать, что пользователи выбирают надежные пароли.

Надежный пароль является сложным (содержащий смесь прописных, строчных, числовых и специальных символов) и не является словом. В этом примере показано, как проверить сложность.

Пример

Код

''' <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

Компиляция кода

Вызовите этот метод, передав строку, содержащую этот пароль.

Для этого примера требуются:

Безопасность

Если вы перемещаете пароль по сети, необходимо использовать безопасный метод для передачи данных. Дополнительные сведения см. в разделе ASP.NET Web Application Security.

Вы можете повысить точность ValidatePassword функции, добавив дополнительные проверка сложности:

  • Сравните пароль и его подстроки с именем пользователя, идентификатором пользователя и словарем, определенным приложением. Кроме того, визуально похожие символы обрабатываются как эквивалентные при выполнении сравнений. Например, следует рассматривать буквы "l" и "e" как эквивалентные числовым числам "1" и "3".

  • Если имеется только один верхний регистр, убедитесь, что он не является первым символом пароля.

  • Убедитесь, что последние два символа пароля являются буквами.

  • Не разрешайте пароли, в которых все символы вводятся из верхней строки клавиатуры.

См. также