Passo a passo: Validando se as senhas são complexas (Visual Basic)
Este método verifica a existência de algumas características de senhas robustas e atualiza um parâmetro de string com informações sobre em quais quesitos a senha falha.
Senhas podem ser usadas num sistema seguro para autenticar um usuário.Entretanto, as senhas não devem ser facilmente adivinhadas por usuários não autorizados.Invasores podem usar um programa de Dictionary Attack, que faz iterações através de todas as palvras num dicionário (ou vários dicionários em linguagens diferentes) e teste se alguma das palavras funciona como senha de usuário.Senhas frágeis como "Yankees" ou "Mustang" podem ser adivinhadas facilmente.Senhas robustas, como "?You'L1N3vaFiNdMeyeP@sSWerd!", são muito menos prováveis de serem adivinhadas.Um sistema protegido por senha deve assegurar que usuários escolham senhas robustas.
Uma senha robusta é complexa (contendo uma mistura de letras maiúsculas, minúsculas, números e caracteres especiais) e não é uma palavra.Este exemplo demonstra como verificar a complexidade das senhas.
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
Compilando o código
Chame este mtodo passando a string que contém a senha.
Este exemplo requer:
- Acesso aos membros do espaço de nomes System.Text.RegularExpressions.Adicione uma declaração Imports se você não está qualificando completamente os nomes de membros em seu código.Para obter mais informações, consulte Importa instrução (.NET espaço para nome e tipo).
Segurança
Se você está movimento a senha numa rede, você precisa usar um método seguro para transferência de dados.Para obter mais informações, consulte ASP.NET Web Application Security.
Você pode aumentar a precisão da função ValidatePassword adicionando verificações de complexidade adicionais:
Compare a senha e suas substrings com o nome do usuário, seu ID, e com um dicionário definido pelo aplicativo.Além disso, trate caracteres visualmente similares como equivalentes quando fizer as comparações.Por exemplo, trate as letras "l" e "e" como equivalentes aos numerais "1" e "3".
Se há apenas um caractere maiúsculo, garanta que não é o primeiro caractere do password.
Garanta que os dois últimos caracteres da senha são letras.
Não permita senhas nas quais todos os símbolos inseridos são da linha de cima do teclado.