PHPでパスワードの強度を調べる

(1/1)
強いパスワードをつくる」では、強いパスワードをつくる方法を説明した。では、実際につくったプログラムの強度はどのくらいだろうか――。
今回は、文字の種類や長さのほか、既存単語かどうか、パスワードの強度を調べる PHP プログラムを作ってみることにする。なお、入力したパスワードをデータベースやファイル、キャッシュに蓄えることはしないが、ネット越しにパスワードが行き来するので、万が一のことを考え、ここで検査したパスワードを本番認証には使わないようにしてほしい。

目次

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

PHPでパスワードの強度を調べる

サンプル・プログラムのダウンロード

圧縮ファイルの内容
passwordStrength.phpサンプル・プログラム本体

パスワードの強度

ここでは、パスワードの強度を下記のように定義する。数字が大きいほど強い。
  1. 数字だけ
  2. 英数 6 文字以下
  3. Wikipedia の見出しに存在する
  4. 記号が含まれていない
  5. 記号が含まれている

解説:数字だけ

数字だけからなる文字列かどうかを調べるユーザー関数が isNumber である。正規表現を使って判定している。

0137: /**
0138:  * 数字だけからなる文字列かどうか
0139:  * @param string $str 文字列
0140:  * @return bool TRUE:数字だけである/FALSE:ではない
0141: */
0142: function isNumber($str) {
0143:     return preg_match('/^[0-9]+$/ui', $str) ? TRUE : FALSE;
0144: }

解説:英数6文字以下

英数 6 文字以下の文字列かどうかを調べるユーザー関数が is6Characters である。これも正規表現を使って判定している。

0146: /**
0147:  * 英数6文字以下の文字列かどうか
0148:  * @param string $str 文字列
0149:  * @return bool TRUE:英数6文字以下である/FALSE:ではない
0150: */
0151: function is6Characters($str) {
0152:     return preg_match('/^[a-z|0-9]{1,6}$/ui', $str) ? TRUE : FALSE;
0153: }

解説:Wikipediaの見出しに存在する

既存の単語かどうかを調べるのに、Wikipedia の見出しに存在するかどうかを調べることにした。このためのユーザー関数が isWikipedia である。
文字列から Wikipedia の見出し URL を生成し、「PHP でリンク切れを調べる」で作ったユーザー関数 getHttpResponseCodeSize を使って存在するかどうか判定する。

0208: /**
0209:  * Wikipediaの見出しに存在する文字列かどうか
0210:  * @param string $str 文字列
0211:  * @return bool TRUE:存在する/FALSE:しない
0212: */
0213: function isWikipedia($str) {
0214:     $str = urlencode($str);
0215:     $url  = 'https://en.wikipedia.org/wiki/' . $str;
0216:     list($code$size) = getHttpResponseCodeSize($url);
0217: 
0218:     return ($code == 200) ? TRUE : FALSE;
0219: }

解説:記号を含まない

記号を含まない文字列かどうかを調べるユーザー関数が isnotSymbol である。これも正規表現を使って判定している。

0221: /**
0222:  * 記号を含まない文字列かどうか
0223:  * @param string $str 文字列
0224:  * @return bool TRUE:記号が含まれていない/FALSE:含まれている
0225: */
0226: function isnotSymbol($str) {
0227:     return preg_match('/^[a-z|0-9]+$/ui', $str) ? TRUE : FALSE;
0228: }

解説:パスワードの強度を算出

以上のユーザー関数を順次呼び出し、パスワードの強度を算出するユーザー関数が getPasswordStrength である。

0230: /**
0231:  * パスワードの強度を算出
0232:  * @param string $psw パスワード
0233:  * @return int 強度
0234:  *              1:数字だけ
0235:  *              2:英数6文字以下
0236:  *              3:Wikipediaの見出しに存在する
0237:  *              4:記号が含まれていない
0238:  *              5:記号が含まれている
0239: */
0240: function getPasswordStrength($psw) {
0241:     //強度と判定関数の対応表
0242:     $table = array(
0243: 1 => 'isNumber',
0244: 2 => 'is6Characters',
0245: 3 => 'isWikipedia',
0246: 4 => 'isnotSymbol'
0247: );
0248: 
0249:     //入力値(パスワード)の検査
0250:     $str = preg_replace('/[ \t]+/ui', '', $psw);    //空白を除く
0251: 
0252:     //パスワード強度判定
0253:     $res = 5;
0254:     foreach ($table as $key=>$func) {
0255:         if ($func($str)) {
0256:             $res = $key;
0257:             break;
0258:         }
0259:     }
0260:     return $res;
0261: }

参考サイト

(この項おわり)
header