2017年10月24日火曜日

【PHP】パスワード生成

パスワードを生成する、ちょっとだけ凝った関数を作ってみた。
特徴と制限  :
1.大文字・小文字・数字と記号をバランスよく含む。
2.始めの文字を大文字または小文字に限定できる。
3.各文字は重複出現しない。
4.50桁程度まで。


  function genpass( $siz=8, $symb=True, $mode='' ) {
  //Returns random letters, numbers and symbols. Each element appears once.
  // $siz  : size of password generated; should not be bigger than element size(49 + symbols).
  // $symb : True .. symbols are included
  // $mode : A .. start with Upper alphabetic; a .. with Lower alphabetic; // '' (default) .. start with Upper or Lower alphabetic; // other .. no restriction; 
    //allowed letters and symbols
    $symbase = ['!','#','$','%','&','+','/','=','-'];
    $upper = array_merge( range('A', 'N'), range('P', 'Z'));        //omit 'O'
    $lower = array_merge( range('a', 'k'), range('m', 'z'));        //omit 'l'
    $symbs = array_merge(( $symb ? $symbase : [] ), range(1, 9));   //omit '0'
    //allot occurrence of upper, lower, and num+symbol
    $sizU = max( 2, intval( $siz * 0.3 ));    
    $sizL = max( 2, intval( $siz * 0.4 ));    
    $sizS = max( 1, $siz - ( $sizU + $sizL ));
    //get password members; can be shorter than siz when siz is big
    shuffle( $upper );  $upper = array_slice( $upper, 0, $sizU );
    shuffle( $lower );  $lower = array_slice( $lower, 0, $sizL );
    shuffle( $symbs );  $symbs = array_slice( $symbs, 0, $sizS );
    //get first letter
    switch ( $mode ) {
      case 'A' :  //start with upper
        $fch = array_shift( $upper );
        break;
      case 'a' :
        $fch = array_shift( $lower );
        break;
      default:
        $fch = '';
        break;
    }
    //merge everything and shaffle
    $pasbase = array_merge( $upper, $lower, $symbs );    shuffle( $pasbase );
    if ( ''===$mode ) {
      while( ! ((('a'<=$pasbase[ 0 ])&&($pasbase[ 0 ]<='z')) || (('A'<=$pasbase[ 0 ])&&($pasbase[ 0 ]<='Z')))) {
        $elm = array_shift( $pasbase );
        $pasbase[] = $elm;
      }
    }
    return $fch . implode( $pasbase );
  }


テスト結果 :
Z6chV9yDg-
Z7cgqtB%V8
WFc-=gv4Ny
V9j3oT%rWq
MzkqNP4f53

zM=Ff!wjL6
r!G1mRJe6x
tQv63Pi=Zh
pA8X3iPxa%
etWv9#KhU7