PHPで桁数を指定してランダムなパスワードを生成する

PHPを使用していて桁数を指定し、ランダムなパスワードや文字列を生成したいことがあると思います。
今回の記事ではPHPを使用し、ランダムなパスワードを桁数を指定して生成する方法について紹介します。

やり方は、色々あると思うのですが、今回は、以下のようなプログラムを紹介します。

方法1

下記のプログラムの関数を使用すると、桁数を指定してランダムなパスワードを出力することができます。
比較的簡単なロジックなので、色々な場面で使用できると思います。

function generatePassword($length = 8) {
    $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    $count = mb_strlen($chars);

    for ($i = 0, $result = ''; $i < $length; $i++) {
        $index = rand(0, $count - 1);
        $result .= mb_substr($chars, $index, 1);
    }

    return $result;
}

echo generatePassword(9);

この例では、使用したい文字の種類の設定があまり細かくできないので、次の例で、使用したい文字列をある程度指定できるプログラムを紹介します。

方法2

$lengthに桁数、$available_setsに使用したい文字列を指定すると、桁数をしたパスワードを出力する関数です。
下記のロジックを使用すると使用したい文字の種類、桁数のパスワードなどで使用できる文字列を出力することができます。

function generateStrongPassword($length = 9, $available_sets = 'luds')
{
	$sets = array();
	if(strpos($available_sets, 'l') !== false)
		$sets[] = 'abcdefghjkmnpqrstuvwxyz';
	if(strpos($available_sets, 'u') !== false)
		$sets[] = 'ABCDEFGHJKMNPQRSTUVWXYZ';
	if(strpos($available_sets, 'd') !== false)
		$sets[] = '123456789';
	if(strpos($available_sets, 's') !== false)
		$sets[] = '!@#$%&*?';

	$all = '';
	$password = '';
	foreach($sets as $set)
	{
		$password .= $set[array_rand(str_split($set))];
		$all .= $set;
	}

	$all = str_split($all);
	for($i = 0; $i < $length - count($sets); $i++)
		$password .= $all[array_rand($all)];

	$password = str_shuffle($password);

	
	return $password;
}

echo generateStrongPassword(9,'luds');

方法1の$chars変数に使用したい文字列を詰める方法でも同じようなロジックを組めると思います。

他にも、ランダムなパスワードをPHPでは、1行で作成することができるようです。
桁数や文字列を指定できませんが、やり方を知りたい方は、Qiitaのランダムなパスワードを1行で生成するのリンクを参考にしてみてください。

今回は、ランダムな文字列の出力をPHPで求める方法について紹介しました。
例えば、ECサイトのオーダーIDなど会員IDなどに日付時刻やなんやら付加して、桁数を指定し、ユニークな文字列に求めたいときにも応用すれば使用できると思います。

PHPで文字数や文字列を指定してランダムな文字列を求めたい際の参考にしてください。