PHPで記号を含むランダムなパスワードを文字数を指定して生成する

2014-03-07

PHPを書いていると、ランダムな文字列が欲しいときが有ります。また、英字大文字や小文字、記号といった予測され難い文字列が混在したパスワードが生成出来ると便利です。

サンプル

<?php

/*
 * 汎用パスワード生成
 * 
 * numlic       = 数字
 * symbol       = 記号
 * alpha        = 英字大小
 * alpha_numlic = 英字大小+数字
 * 
 * createPassword('type name','length');
 */

function createPassword($type='',$length=8){
    
 /*
  * 半角大文字・小文字,数字,記号をそれぞれ配列にする
  */
    $pwd_small = range('a', 'z');
    $pwd_big   = range('A', 'Z');
    $pwd_num   = range('0', '9');
    $pwd_sybl  = array_merge(range('!', '/'), range(':', '@'), range('{', '~'));
    
 /*
  * タイプで生成するパスワード文字を結合して配列にする
  */
    switch($type){
       case 'numlic': //数字だけ
          $pwd_strings = $pwd_num;
       break;
       case 'symbol': //記号だけ
          $pwd_strings = $pwd_sybl;
       break;
       case 'alpha': //英字大小だけ
          $pwd_strings = array_merge($pwd_small,$pwd_big);
       break;
       case 'alpha_numlic': //英字大小+数字
          $pwd_strings = array_merge($pwd_small,$pwd_big,$pwd_num);
       break;
       default: //全て
          $pwd_strings = array_merge($pwd_small,$pwd_big,$pwd_num,$pwd_sybl);
    }
    
    $pwd = array();
    while (count($pwd) < $length) {
       $key = array_rand($pwd_strings); //生成された配列からランダムに1つのキーを取り出す
       $key = $pwd_strings[$key]; //そのキーの値を得る
       $pwd[] = $key;
    }
    shuffle($pwd); //配列をシャッフルする
    $pwd = implode($pwd); //区切り文字無しで文字列に

    return $pwd;
}

//指定無し *8文字の全部入り
   $password = createPassword();
   print_r($password);
   
//英数字で30文字
   $password = createPassword('alpha_numlic',30);
   print_r($password);
   
?>

数字や記号を配列化しておき、その中からランダムに要素を取り出しながら、指定文字数分のパスワードを生成します。また、数字だけ、記号だけといったように指定する事も可能です。

文字数を50文字程度+time()などくっつけてしまえば、ほぼ被らない乱数を生成出来ると思いますが、神のいたずらで偶然同じものが生成されてしまう可能性は有ります。データベースのユニークなカラムへインサートする場合は、生成したパスワードが存在しないか確認しつつ、生成していけば良いかと思います。

記号を含む場合、例えばカンマなどはデータベースレコードをCSVにエクスポートする場合など、邪魔になるかもしれません。それは工夫してみて下さい。