DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

パスワードのようなランダムな文字列を生成する

ここでは、パスワードとして使えそうな、ランダムな文字列を作成する方法を幾つか紹介します。

.NET Framework 2.0以上で、Membership.GeneratePasswordメソッドを使用する

.NET Framework 2.0からは、Membershipクラス(System.Web.Security名前空間)のGeneratePasswordメソッドを使って簡単にできます。Membershipクラスを使用するには、System.Web.dllを参照設定に追加する必要があります。

GeneratePasswordメソッドで生成される文字列には、アルファベットの大文字、小文字、数字と、それ以外に、!@#$%^&*()_-+=[{]};:<>|./?(区切り記号)が使用されます。

以下に、8文字のランダムな文字列を生成する例を示します。

VB.NET
コードを隠すコードを選択
'8文字のランダムパスワードを生成する(区切り記号は含まなくても良い)
Dim pass As String = System.Web.Security.Membership.GeneratePassword(8, 0)
C#
コードを隠すコードを選択
//8文字のランダムパスワードを生成する(区切り記号は含まなくても良い)
string pass = System.Web.Security.Membership.GeneratePassword(8, 0);

GeneratePasswordメソッドの1番目のパラメータには、生成する文字列の長さを指定します。これは、128以下である必要があります。2番目のパラメータには、文字列に最低限含まれる区切り記号の数を指定します。つまり2番目のパラメータに 0 を指定しても、文字列に区切り記号が含まれる可能性は十分にあります。

自分でコードを書く

自分でコードを書くことによってランダムな文字列を作成する例を1つ紹介します。以下に紹介する方法では、パスワードに使用できる文字をあらかじめ用意しておき、乱数でどれかの文字を選んでいくことによって、パスワードを作成しています。

VB.NET
コードを隠すコードを選択
'パスワードに使用する文字
Private Shared ReadOnly passwordChars As String = "0123456789abcdefghijklmnopqrstuvwxyz"

''' <summary>
''' ランダムな文字列を生成する
''' </summary>
''' <param name="length">生成する文字列の長さ</param>
''' <returns>生成された文字列</returns>
Public Function GeneratePassword(ByVal length As Integer) As String
    Dim sb As New System.Text.StringBuilder(length)
    Dim r As New Random()

    For i As Integer = 0 To length - 1
        '文字の位置をランダムに選択
        Dim pos As Integer = r.Next(passwordChars.Length)
        '選択された位置の文字を取得
        Dim c As Char = passwordChars(pos)
        'パスワードに追加
        sb.Append(c)
    Next

    Return sb.ToString()
End Function
C#
コードを隠すコードを選択
//パスワードに使用する文字
private static readonly string passwordChars = "0123456789abcdefghijklmnopqrstuvwxyz";

/// <summary>
/// ランダムな文字列を生成する
/// </summary>
/// <param name="length">生成する文字列の長さ</param>
/// <returns>生成された文字列</returns>
public string GeneratePassword(int length)
{
    StringBuilder sb = new StringBuilder(length);
    Random r = new Random();

    for (int i = 0; i < length; i++)
    {
        //文字の位置をランダムに選択
        int pos = r.Next(passwordChars.Length);
        //選択された位置の文字を取得
        char c = passwordChars[pos];
        //パスワードに追加
        sb.Append(c);
    }

    return sb.ToString();
}

この例ではRandomクラスを使用していますが、より厳密さが必要であれば、RNGCryptoServiceProviderクラスを使用してください。詳しくは、「乱数を生成する」をご覧ください。

GUIDを使用する

非常に単純ですが、お手軽な方法としては、GUID(グローバル一意識別子)を使用する方法もあります。数字とa〜fまでの文字しか使われませんので、パスワードとしては非常に弱いです。

VB.NET
コードを隠すコードを選択
'8文字のランダムな文字列を作成する
Dim g As Guid = System.Guid.NewGuid()
Dim pass As String = g.ToString("N").Substring(0, 8)
C#
コードを隠すコードを選択
//8文字のランダムな文字列を作成する
Guid g = System.Guid.NewGuid();
string pass = g.ToString("N").Substring(0, 8);

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • 「???を参照に追加します」の意味が分からないという方は、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。