Procedura dettagliata: verifica della complessità delle password (Visual Basic)
Questo metodo verifica se sono presenti determinate caratteristiche di password complessa e aggiorna un parametro di tipo stringa con informazioni sui controlli che la password non supera.
Le password vengono utilizzate in un sistema protetto per autorizzare un utente. Per gli utenti non autorizzati, tuttavia, deve essere difficile indovinare una password. Gli intrusi possono utilizzare un programma di attacco con dizionario che scorre tutte le parole di un dizionario, o di molti dizionari in lingue diverse, verificando se una delle parole funziona come password utente. Password vulnerabili come "Americani" o "Mustang" sono facili da indovinare. Password più complesse, quali "?Ale'L1N3vaFiNdMeyeP@sSWerd!", verranno indovinate con molta più fatica. In un sistema protetto con password è essenziale verificare che gli utenti scelgano password complesse.
Una password complessa contiene una combinazione di caratteri maiuscoli, minuscoli, numerici e speciali, e non è una parola. Nell'esempio seguente viene mostrato come verificare la complessità di una password.
Esempio
Codice
''' <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
Compilazione del codice
Chiama questo metodo passando la stringa che contiene la password.
L'esempio presenta i seguenti requisiti:
- Accesso ai membri dello spazio dei nomi System.Text.RegularExpressions. Aggiungere un'istruzione Imports se i nomi dei membri all'interno del codice non sono specificati in modo completo. Per ulteriori informazioni, vedere Istruzione Imports (tipo e spazio dei nomi .NET).
Sicurezza
Se si sta spostando una password su una rete, è necessario utilizzare un metodo sicuro per trasferire i dati. Per ulteriori informazioni, vedere ASP.NET Web Application Security.
È possibile migliorare la precisione della funzione ValidatePassword aggiungendo dei controlli di complessità supplementari:
Confrontare la password e le sue sottostringhe con il nome e l'identificativo dell'utente e un dizionario definito dall'applicazione. Inoltre, considerare i caratteri visivamente simili come equivalenti quando si esegue il confronto. Ad esempio, considerare le lettere "l" ed "e" come equivalenti ai numeri "1" e "3".
Se viene utilizzato un solo carattere maiuscolo, accertarsi che non sia il primo carattere della password.
Verificare che gli ultimi due caratteri della password siano delle lettere.
Non consentire l'utilizzo di password in cui tutti i simboli sono stati immessi dalla prima riga della tastiera.