Condividi tramite


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

Questo metodo verifica la presenza di alcune caratteristiche della password complessa e aggiorna un parametro stringa con informazioni su quali controlli la password ha esito negativo.

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 attaccanti possono usare un programma di attacco dizionario, che esamina tutte le parole di un dizionario (o più dizionari in lingue diverse) e verifica se una delle parole funziona come password dell'utente. È possibile indovinare rapidamente password deboli come "Yankees" o "Mustang". Password più forti, come "?You'L1N3vaFiNdMeyeP@sSWerd!", sono molto meno probabilmente indovinabili. Un sistema protetto da password deve garantire che gli utenti scelgano password complesse.

Una password complessa è complessa (contenente una combinazione di caratteri maiuscoli, minuscoli, numerici e speciali) e non è 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.

Questo esempio richiede:

Sicurezza

Se si sposta la password in una rete, è necessario usare un metodo sicuro per il trasferimento dei dati. Per altre informazioni, vedere ASP.NET Web Application Security.

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

  • 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 caratteri di lettera.

  • Non consentire password in cui tutti i simboli vengono immessi dalla riga superiore della tastiera.

Vedere anche