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

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

(2020 年 5 月 4 日)PHP8 対応,リファラチェック追加

サンプル・プログラムの実行例

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

サンプル・プログラム

圧縮ファイルの内容
ipassword2.phpサンプル・プログラム本体。
ipassword2js.htmlJavaScript版のサンプル・プログラム。

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

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

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

0157: /**
0158:  * 母音を除く
0159:  * @param string $str 文字列
0160:  * @return string 変換後文字列
0161: */
0162: function delVowel($str) {
0163:     $pat = "/[AIUEO]+/i";
0164:     return preg_replace($pat, '', $str);
0165: }

0167: /**
0168:  * 任意の位置に数字(・記号)を挿入する
0169:  * @param string $str 元になる文字列
0170:  * @param int $num 挿入する数字(・記号)の数(1~3)
0171:  * @oaram bool $flag TRUE:記号を含める/FALSE:記号を含めない
0172:  * @return string 挿入語文字列/FALSE:$numが範囲外
0173: */
0174: function insString($str$num$flag) {
0175:     static $tbl1 = '0123456789';
0176:     static $tbl2 = '0123456789+-*/=$';
0177: 
0178:     if ($num < 1 || $num > 3)   return FALSE;
0179: 
0180:     make_seed();
0181:     //元の文字列を分割する
0182:     $ln = strlen($str);
0183:     $n = mt_rand(0, $ln);
0184:     $s1 = substr($str, 0, $n);
0185:     $s2 = substr($str$n$ln - $n);
0186: 
0187:     //挿入する数字(・記号)を生成
0188:     $tbl = $flag ? $tbl2 : $tbl1;
0189:     $ln = strlen($tbl);
0190:     $s3 = '';
0191:     for ($i = 0; $i < $num$i++) {
0192:         $n = mt_rand(0, $ln - 1);
0193:         $s3 .= substr($tbl$n, 1);
0194:     }
0195: 
0196:     return $s1 . $s3 . $s2;
0197: }

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

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

セキュリティ上の注意点

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

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

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

参考サイト

(この項おわり)
header