PHPの勉強に「10 Life-Saving PHP Snippets」で紹介されているコードを読んでみる。
■Automatic password creation(自動パスワード生成機)
ソースコードは次のようなもの。
function generatePassword($length=9, $strength=0) {
$vowels = 'aeuy';
$consonants = 'bdghjmnpqrstvz';
if ($strength >= 1) {
$consonants .= 'BDGHJLMNPQRSTVWXZ';
}
if ($strength >= 2) {
$vowels .= "AEUY";
}
if ($strength >= 4) {
$consonants .= '23456789';
}
if ($strength >= 8 ) {
$vowels .= '@#$%';
}
$password = '';
$alt = time() % 2;
for ($i = 0; $i < $length; $i++) {
if ($alt == 1) {
$password .= $consonants[(rand() % strlen($consonants))];
$alt = 0;
} else {
$password .= $vowels[(rand() % strlen($vowels))];
$alt = 1;
}
}
return $password;
}
関数の最初の引数「$length」はパスワードの文字数。
2番目の引数「$strength」はパスワードの強度。
数値が大きくなるにつれ、パスワードに使用される文字種が増える。
■使用例
echo generatePassword(10,8);
実行結果
5Yr#H%hE6Y
■解説
$vowels = 'aeuy';
$consonants = 'bdghjmnpqrstvz';
if ($strength >= 1) {
$consonants .= 'BDGHJLMNPQRSTVWXZ';
}
if ($strength >= 2) {
$vowels .= "AEUY";
}
if ($strength >= 4) {
$consonants .= '23456789';
}
if ($strength >= 8 ) {
$vowels .= '@#$%';
}
コードの前半では、引数「$strength」の値によって、パスワードに使用する文字種を設定している。
“1”・”I”・”l”のような見間違いしやすい文字は、パスワードで使用する文字から外している。
パスワードに使用する文字を変数「$vowels」と「$consonants」の2つに分けているところに工夫が見られる。
$password = '';
$alt = time() % 2;
for ($i = 0; $i < $length; $i++) {
if ($alt == 1) {
$password .= $consonants[(rand() % strlen($consonants))];
$alt = 0;
} else {
$password .= $vowels[(rand() % strlen($vowels))];
$alt = 1;
}
}
コードの後半では、2つの変数から交互に文字を取り出してパスワードを作成している。
time()関数は現在時刻を返す関数。
$altの値は同じ確率で、0または1になる。
rand()は乱数を生成する関数。
文字種の中からランダムに人文字をとりだして、パスワードに追加している。
rand関数には、引数をとるタイプのものもある。
int rand ( int $min , int $max )
こちらのタイプを使うと次のように書くこともできる。
//$password .= $consonants[(rand() % strlen($consonants))];
$password .= $consonants[rand(0, strlen($consonants))];