Condividi tramite


Procedura dettagliata: verifica della complessità delle password (Visual Basic)

Questo metodo verifica alcune caratteristiche delle password complesse e aggiorna un parametro di stringa con le informazioni sui controlli che la password non ha superato.

Le password possono essere usate in un sistema sicuro per autorizzare un utente. Tuttavia, le password devono essere difficili da indovinare per gli utenti non autorizzati. Gli utenti malintenzionati possono usare un programma di attacco a dizionario, che scorre tutte le parole in un dizionario (o più dizionari in lingue diverse) e verifica se una delle parole funziona come password dell'utente. È possibile indovinare rapidamente password vulnerabili come "Yankees" o "Mustang". Password più complesse, ad esempio "?You'L1N3vaFiNdMeyeP@sSWerd!", hanno minori probabilità di essere indovinate. Un sistema protetto tramite password deve assicurarsi che gli utenti scelgano password complesse.

Una password complessa contiene una combinazione di caratteri maiuscoli, minuscoli, numerici e speciali e non è costituita da una parola. In questo esempio viene illustrato come verificare la complessità.

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

Compilare il codice

Chiamare questo metodo passando la stringa che contiene la password.

L'esempio presenta i requisiti seguenti:

Sicurezza

Se la password viene spostata all'interno di una rete, è necessario usare un metodo sicuro per il trasferimento dei dati. Per altre informazioni, vedere Sicurezza dell'applicazione Web ASP.NET.

È possibile migliorare l'accuratezza della funzione ValidatePassword aggiungendo ulteriori controlli di complessità:

  • Confrontare la password e le relative sottostringhe con il nome dell'utente, l'identificatore utente e un dizionario definito dall'applicazione. Considerare inoltre caratteri visivamente simili come equivalenti durante l'esecuzione dei confronti. Ad esempio, considerare le lettere "l" e "e" come equivalenti ai numeri "1" e "3".

  • Se è presente un solo carattere maiuscolo, assicurarsi che non sia il primo carattere della password.

  • Assicurarsi che gli ultimi due caratteri della password siano lettere.

  • Non consentire password contenenti tutti i simboli presenti nella fila di tasti superiore della tastiera.

Vedi anche