Пошаговое руководство. Проверка паролей на сложность (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
Компиляция кода
Вызовите этот метод, передав строку, содержащую этот пароль.
Для этого примера требуются:
- Доступ к членам пространства имен System.Text.RegularExpressions. Добавьте оператор
Imports
, если в коде не используются полные имена членов. Дополнительные сведения см. в статье Оператор Imports (пространство имен .NET и тип).
Безопасность
Если вы перемещаете пароль по сети, необходимо использовать безопасный метод для передачи данных. Дополнительные сведения см. в разделе ASP.NET Web Application Security.
Вы можете повысить точность ValidatePassword
функции, добавив дополнительные проверка сложности:
Сравните пароль и его подстроки с именем пользователя, идентификатором пользователя и словарем, определенным приложением. Кроме того, визуально похожие символы обрабатываются как эквивалентные при выполнении сравнений. Например, следует рассматривать буквы "l" и "e" как эквивалентные числовым числам "1" и "3".
Если имеется только один верхний регистр, убедитесь, что он не является первым символом пароля.
Убедитесь, что последние два символа пароля являются буквами.
Не разрешайте пароли, в которых все символы вводятся из верхней строки клавиатуры.