PHPで覚えやすいパスワードを作る

(1/1)
PHP でパスワードを生成」で、英数字をランダムに組み合わせるパスワードを作った。これはパスワードの強度的には強いものの、いかにも覚えにくい。
そこで今回は、キーワード(ローマ字)から覚えやすいパスワードを生成するプログラムを作ることにする。

サンプル・プログラム

サンプル・プログラムの流れ

PHPで覚えやすいパスワードを作る

サンプル・プログラムの解説

フローに示したように、次の 2 段階で覚えやすいパスワードを作る。
  1. 入力された文字列(ローマ字)から母音を除く。(delVowel関数)
  2. 1 の文字列を適当に 2 分割し、数字・記号を挿入する。(insString)

0085: /**
0086:  * 母音を除く
0087:  * @param string $str 文字列
0088:  * @return string 変換後文字列
0089: */
0090: function delVowel($str) {
0091:     $pat = "/[AIUEO]+/i";
0092:     return preg_replace($pat, '', $str);
0093: }
0094: 
0095: /**
0096:  * 任意の位置に数字(・記号)を挿入する
0097:  * @param string $str 元になる文字列
0098:  * @param int $num 挿入する数字(・記号)の数(1~3)
0099:  * @oaram bool $flag TRUE:記号を含める/FALSE:記号を含めない
0100:  * @return string 挿入語文字列/FALSE:$numが範囲外
0101: */
0102: function insString($str$num$flag) {
0103:     static $tbl1 = '0123456789';
0104:     static $tbl2 = '0123456789+-*/=$';
0105: 
0106:     if ($num < 1 || $num > 3)   return FALSE;
0107: 
0108:     make_seed();
0109:     //元の文字列を分割する
0110:     $ln = strlen($str);
0111:     $n = mt_rand(0, $ln);
0112:     $s1 = substr($str, 0, $n);
0113:     $s2 = substr($str$n$ln - $n);
0114: 
0115:     //挿入する数字(・記号)を生成
0116:     $tbl = $flag ? $tbl2 : $tbl1;
0117:     $ln = strlen($tbl);
0118:     $s3 = '';
0119:     for ($i = 0; $i < $num$i++) {
0120:         $n = mt_rand(0, $ln - 1);
0121:         $s3 .= substr($tbl$n, 1);
0122:     }
0123: 
0124:     return $s1 . $s3 . $s2;
0125: }

ユーザー関数 delVowel では、正規表現による置換関数  preg_replace  を用いて母音を取り除くようにしている。

ユーザー関数 insString では、まず、乱数を発生する関数  mt_rand  を用いて分割する位置を求める。挿入する数字(・記号)は、あらかじめテーブル変数 $tbl1(または$tbl2)に用意し、乱数を使ってこのテーブルから引き出すようにしている。

セキュリティ上の注意点

このプログラムでは、元の文字列や作成されたパスワードがネットワーク上を平文で行き来するので、盗み見できてしまう。実際に使うパスワードは、作成された文字列を更に加工してほしい。

配布 ZIP ファイルに含まれている password2js.html は、この PHP プログラムを JavaScript に移植したものである。ネットワーク処理はなく、作成されたパスワードが平文で外に漏れるようなこともない。

サンプル・プログラム (JavaScript版)

参考サイト

(この項おわり)
header