次の方法で共有


チュートリアル: パスワードが複雑であることを検証する (Visual Basic)

このメソッドは、いくつかの強力なパスワード特性をチェックし、パスワードが失敗したチェックに関する情報で文字列パラメーターを更新します。

パスワードは、セキュリティで保護されたシステムでユーザーを承認するために使用できます。 パスワードは、承認されていないユーザーが推測しにくいものでなければなりません。 攻撃者は 辞書攻撃 プログラムを使用できます。辞書内のすべての単語 (または異なる言語の複数の辞書) を反復処理し、単語のいずれかがユーザーのパスワードとして機能するかどうかをテストします。 「ヤンキース」や「マスタング」などの脆弱なパスワードはすぐに推測できます。 "より強力なパスワード、たとえば「?You'L1N3vaFiNdMeyeP@sSWerd!」は推測される可能性がはるかに低くなります。" パスワードで保護されたシステムでは、ユーザーが強力なパスワードを選択する必要があります。

強力なパスワードは複雑であり (大文字、小文字、数字、および特殊文字が混在して含まれます)、単語ではありません。 この例では、複雑さを確認する方法を示します。

コード

''' <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

コードをコンパイルする

そのパスワードを含む文字列を渡して、このメソッドを呼び出します。

この例では、次のものが必要です。

安全

ネットワーク経由でパスワードを移動する場合は、セキュリティで保護された方法を使用してデータを転送する必要があります。 詳細については、「 ASP.NET Web アプリケーションのセキュリティ」を参照してください。

さらに複雑さのチェックを追加することで、 ValidatePassword 関数の精度を向上させることができます。

  • パスワードとその部分文字列を、ユーザーの名前、ユーザー識別子、およびアプリケーション定義ディクショナリと比較します。 さらに、比較を実行するときに、視覚的に似た文字を同等として扱います。 たとえば、文字 "l" と "e" を数字 "1" と "3" と等価として扱います。

  • 大文字が 1 文字しかない場合は、パスワードの最初の文字ではないことを確認します。

  • パスワードの最後の 2 文字が文字であることを確認します。

  • キーボードの先頭行からすべての記号を入力するパスワードは許可しないでください。

こちらも参照ください