Пошаговое руководство. Проверка паролей на сложность (Visual Basic)
Этот метод проверяет некоторые характеристики строгого пароля и обновляет строковый параметр сведениями о том, какие проверки пароля не выполнены.
Пароли могут использоваться в системе безопасности для авторизации пользователя. Однако пароли должны быть сложными для взлома. Злоумышленники могут использовать программу словарной атаки, которая перебирает все слова в словаре (или нескольких словарей на разных языках) и проверяет, является ли любое из слов подходящим в качестве пароля пользователя. Ненадежные пароли, такие как "Yankees" или "Mustang", могут быть подобраны очень быстро. Более надежные пароли, такие как "?You'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.
Можно улучшить точность функции ValidatePassword, добавив дополнительные проверки сложности.
Сравните пароль и его подстроки с именем пользователя, идентификатором пользователя и словарем, определяемым приложением. Кроме того, можно рассматривать визуальный вид символов как эквивалент при выполнении сравнений. Например, можно рассматривать буквы "l" и "e" как эквиваленты цифр "1" и "3".
Если имеется только один символ верхнего регистра, убедитесь, что это не первый знак пароля пользователя.
Убедитесь, что последние два символа пароля — буквы.
Не допускайте пароли, в которых все символы введены из верхнего ряда клавиатуры.