Compartilhar via


Instruções passo a passo: validando senhas complexas (Visual Basic)

Esse método verifica se há características de senha forte e atualiza um parâmetro de cadeia de caracteres com informações sobre em quais verificações uma senha falha.

As senhas podem ser usadas em um sistema seguro para autorizar um usuário. No entanto, as senhas precisam ser difíceis para os usuários não autorizados adivinharem. Os invasores podem usar um programa de ataque de dicionário, que itera todas as palavras em um dicionário (ou vários dicionários em idiomas diferentes) e testa se alguma das palavras funciona como senha de um usuário. Senhas fracas como "Yankees" ou "Mustang" podem ser adivinhadas rapidamente. Senhas mais fortes, como "?You'L1N3vaFiNdMeyeP@sSWerd!", são muito menos propensas a serem adivinhadas. Um sistema protegido por senha deve garantir que os usuários escolham senhas fortes.

Uma senha forte é complexa (contendo uma mistura de caracteres maiúsculos, minúsculos, numéricos e especiais) e não é uma palavra. Este exemplo demonstra como verificar a complexidade.

Exemplo

Código

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

Compilar o código

Chame esse método passando a cadeia de caracteres que contém essa senha.

Este exemplo requer:

Segurança

Se você estiver movendo a senha em uma rede, precisará usar um método seguro para transferir dados. Para obter mais informações, consulte Segurança do Aplicativo Web ASP.NET.

Você pode melhorar a precisão da função ValidatePassword adicionando verificações de complexidade adicionais:

  • Compare a senha e as subcadeias de caracteres dela com o nome do usuário, o identificador de usuário e um dicionário definido pelo aplicativo. Além disso, trate caracteres visualmente semelhantes como equivalentes ao executar as comparações. Por exemplo, trate as letras "l" e "e" como equivalentes aos numerais "1" e "3".

  • Se houver apenas um caractere maiúsculo, verifique se ele não é o primeiro caractere da senha.

  • Verifique se os dois últimos caracteres da senha são caracteres de letra.

  • Não permita senhas nas quais todos os símbolos são inseridos na linha superior do teclado.

Confira também