ここでは、パスワードとして使えそうな、ランダムな文字列を作成する方法を幾つか紹介します。
.NET Framework 2.0からは、Membershipクラス(System.Web.Security名前空間)のGeneratePasswordメソッドを使って簡単にできます。Membershipクラスを使用するには、System.Web.dllを参照設定に追加する必要があります。
GeneratePasswordメソッドで生成される文字列には、アルファベットの大文字、小文字、数字と、それ以外に、!@#$%^&*()_-+=[{]};:<>|./?(区切り記号)が使用されます。
以下に、8文字のランダムな文字列を生成する例を示します。
'8文字のランダムパスワードを生成する(区切り記号は含まなくても良い) Dim pass As String = System.Web.Security.Membership.GeneratePassword(8, 0)
//8文字のランダムパスワードを生成する(区切り記号は含まなくても良い) string pass = System.Web.Security.Membership.GeneratePassword(8, 0);
GeneratePasswordメソッドの1番目のパラメータには、生成する文字列の長さを指定します。これは、128以下である必要があります。2番目のパラメータには、文字列に最低限含まれる区切り記号の数を指定します。つまり2番目のパラメータに 0 を指定しても、文字列に区切り記号が含まれる可能性は十分にあります。
自分でコードを書くことによってランダムな文字列を作成する例を1つ紹介します。以下に紹介する方法では、パスワードに使用できる文字をあらかじめ用意しておき、乱数でどれかの文字を選んでいくことによって、パスワードを作成しています。
'パスワードに使用する文字 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
//パスワードに使用する文字 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(グローバル一意識別子)を使用する方法もあります。数字とa~fまでの文字しか使われませんので、パスワードとしては非常に弱いです。
'8文字のランダムな文字列を作成する Dim g As Guid = System.Guid.NewGuid() Dim pass As String = g.ToString("N").Substring(0, 8)
//8文字のランダムな文字列を作成する Guid g = System.Guid.NewGuid(); string pass = g.ToString("N").Substring(0, 8);