Partilhar via


Passo a passo: Validando que as senhas são complexas (Visual Basic)

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

As senhas podem ser usadas em um sistema seguro para autorizar um usuário. No entanto, as senhas devem ser difíceis de adivinhar para usuários não autorizados. Os atacantes podem usar um programa de ataque de dicionário, que itera todas as palavras de um dicionário (ou vários dicionários em idiomas diferentes) e testa se alguma das palavras funciona como senha do usuário. Senhas fracas como "Yankees" ou "Mustang" podem ser adivinhadas rapidamente. Senhas mais fortes, como "? Você L1N3vaFiNdMeyeP@sSWerd!", são muito menos prováveis de serem adivinhados. 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 estiver a mover a palavra-passe através de uma rede, tem de utilizar um método seguro para transferir dados. Para obter mais informações, consulte ASP.NET Web Application Security.

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

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

  • Se houver apenas um caractere maiúsculo, certifique-se de que não é o primeiro caractere da senha.

  • Certifique-se de que os dois últimos caracteres da senha são caracteres de letra.

  • Não permita palavras-passe em que todos os símbolos são introduzidos a partir da linha superior do teclado.

Consulte também