チュートリアル: パスワードの複雑さの検証 (Visual Basic)
ここでは、強力なパスワードの特性をチェックし、パスワードの複雑さのチェックに関する情報を使って文字列パラメーターを更新するための方法について説明します。
パスワードは、セキュリティ保護されたシステムでユーザーを承認するために使用します。しかし、パスワードは許可されないユーザーから簡単に推測されないために、複雑であることが必要です。攻撃者は、ある辞書内 (または、さまざな言語の複数の辞書内) のすべての語を反復処理して、その中にユーザーのパスワードと一致するものがあるかどうかを調べる辞書攻撃プログラムを使用する場合があります。"Yankees" や "Mustang" などの脆弱なパスワードでは、簡単に推測される可能性があります。"?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
コードのコンパイル
このメソッドを呼び出すには、パスワードを格納する文字列を渡します。
この例には、次の項目が必要です。
- System.Text.RegularExpressions 名前空間のメンバーに対するアクセス。コード内でメンバー名を完全修飾していない場合は、Imports ステートメントを追加します。詳細については、「Imports ステートメント (.NET 名前空間および型)」を参照してください。
セキュリティ
ネットワーク経由でパスワードを渡す場合は、安全な方法を使用してデータを転送する必要があります。詳細については、「ASP.NET Web Application Security」を参照してください。
次に示す方法で複雑さのチェックを追加すると、ValidatePassword 関数の精度を高めることができます。
パスワードとその部分文字列を、ユーザー名、ユーザー ID、およびアプリケーション定義の辞書と比較します。また、比較を実行するときには、外見が似ている文字を同等として扱ってください。たとえば、"l" と "e" の文字は、"1" と "3" の数字と同等として扱います。
大文字を 1 つしか使っていない場合は、それがパスワードの先頭の文字でないことを確認します。
パスワードの最後の 2 文字がアルファベット文字であることを確認します。
すべての記号がキーワードの一番上の行から入力されているパスワードを禁止します。