PHPの勉強に「10 Life-Saving PHP Snippets」で紹介されているコードを読んでみる。(Automatic password creation)

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))];

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください