はじめに
私は現在、あるコンサルティング案件で、ユーザーアカウントを使用するWebサイトに携わっています。このサイトでは、ユーザーアカウントの作成方法が2種類あります。1つはユーザー自身で作成する方法で、この場合、ユーザーは電子メールアドレスとパスワードを入力します。もう1つはユーザーの上司が作成する方法で、この場合、上司はユーザーの電子メールアドレスだけを入力します。すると、サイトがユーザー用にランダムなパスワードを生成し、そのパスワードをユーザーに電子メールで通知します。ユーザーは最初のログイン時に、このランダムなパスワードを変更しなければなりません。
この方式を実現するためには、ランダムなパスワードを生成するプログラムを書くことが必要でした。そこで、4Guysで"random password"という言葉を検索してみました。残念ながら、ランダムなパスワードの生成について4Guysで見つかった記事はクラシックASP時代の古いものばかりだったので、自分でASP.NETのランダムパスワードジェネレータを書く必要がありました。この必要性については「ASP.NET 2.0's new Membership API」で取り上げられており、実際のところ、ASP.NET 2.0ではMembership.GeneratePassword(length, numberOfNonAlphaNumericCharacters)
を呼び出すだけで済みます。
この記事では、ASP.NET用のランダムパスワードジェネレータについて紹介します。ランダムなパスワードを生成するにはいろいろなテクニックがあり、これらのテクニックについてソースコードを示しながら解説します。それでは始めましょう。
GUIDを使った手っ取り早いランダムなパスワードの生成
ASP.NETを使ってランダムなパスワードを生成する最も簡単な方法は、GUIDの一部を取得することです。GUIDとはGlobally Unique ID(世界で唯一のID)のことで、1つのメソッド呼び出しですぐに生成できる128ビットの数値です。これを使えば、ランダムなパスワードとして使える16進数の文字列を生成することができます。GUIDを新たに生成するには、System.Guid
構造体のNewGuid()
メソッドを使用します。生成したGUIDは.ToString()
メソッドを使って文字列に変換することができます。サンプルコードを以下に示します。
' VB.NET Dim guidResult as String = System.Guid.NewGuid().ToString()
// C# string guidResult = System.Guid.NewGuid().ToString();
このコードを実行するたびに新しいGUIDが生成されます。以下はこのコードを5回実行した場合の結果です。
2fedf13b-8f3d-4c6c-9e36-14885736ed92 bf24060b-0698-4bce-9d0f-c37df2d24508 99931723-a1b6-44be-b4b1-8826dd6f8ceb 5f509578-e1ef-41f2-b3ea-d94caffdcd0e b4e7b807-09a8-4c77-bbfe-28b31f2093dc
私は通常、ハイフン(-)を取り除いてGUIDの最初のn文字を取得します。このテクニックを一般の用途に使えるように、GetRandomPasswordUsingGUID(length)
というメソッドを作ってみましょう。このメソッドでは、ランダムなパスワードの長さを入力し、GUIDの最初のlength
文字(ハイフンを除く)を返します。
' VB.NET Public Function GetRandomPasswordUsingGUID(ByVal length as Integer) _ as String 'Get the GUID Dim guidResult as String = System.Guid.NewGuid().ToString() 'Remove the hyphens guidResult = guidResult.Replace("-", String.Empty) 'Make sure length is valid If length <= 0 OrElse length > guidResult.Length Then Throw New ArgumentException( _ "Length must be between 1 and " & guidResult.Length) End If 'Return the first length bytes Return guidResult.Substring(0, length) End Function
// C# public string GetRandomPasswordUsingGUID(int length) { // Get the GUID string guidResult = System.Guid.NewGuid().ToString(); // Remove the hyphens guidResult = guidResult.Replace("-", string.Empty); // Make sure length is valid if (length <= 0 || length > guidResult.Length) throw new ArgumentException( "Length must be between 1 and " + guidResult.Length); // Return the first length bytes return guidResult.Substring(0, length);
以下はlength
の値をそれぞれ5
、10
、15
にしてこのメソッドを呼び出した結果です。
Random password of length 5:ce7e9 Random password of length 10: 578562009e Random password of length 15: 7b0fc1bc9ea9486