パスワード生成 on Xoops

以前、Perlで書かれた非可逆パスワードの話を書いたのですが、
何処でもPerlが使えるわけではなく、案外不便に感じる事がありました。
特に周りにWindowsしか無かった時。


自分のサイトにパスワード生成を貼り付けたかったので作ることにしました。

まず、phpでパスワード生成を作ります。
元が簡単だったので、非常に簡単です。
<div>
    <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
    <p><label for="passphrase">パスフレーズ:</label><input id="passphrase" name="passphrase" size="20" /></p>
    <p><label for="site">サイト:</label><input id="site" name="site" size="20" /></p>
    <p><input type="submit" value="送信">
    </form>
</div>
<div>
生成されたパスワード:
<?php
if (isset($_POST['passphrase']) && isset($_POST['site'])) {
    $str = $_POST['passphrase'].$_POST['site'];
    echo base64_encode(md5($str));
}
?>
</div>

実際に設置するためには、更にhtmlspecialcharsでエスケープする必要があります。
これで十分なんですが、ちょっと面白くありません。
そこで、Xoopsのモジュールにしてみました。


モジュール化は思ったより簡単でした。

index.phpファイルを作成します。
<?php
include("../../mainfile.php");
include("../../header.php");
include("header.php");
OpenTable();
include("設置するphpファイル");
CloseTable();
include("../../footer.php");
?>
xoops_version.phpファイルを作成します。
<?php
$modversion['name'] = "モジュールの名称を記載";
$modversion['version'] = "バージョンを記載";
$modversion['description'] = "説明を記載";
$modversion['credits'] = "";
$modversion['author'] = "作者名を記載";
$modversion['help'] = "";
$modversion['license'] = "";
$modversion['official'] = 0;
$modversion['image'] = "";
$modversion['dirname'] = "モジュールを設置したディレクトリ名を記載";
$modversion['hasMain'] = 1;
?>

準備ができたら
  1. xoopsのmodulesディレクトリにxoops_version.phpで指定したディレクトリを作成します。
  2. そこにindex.phpと設置したいphpファイルとxoops_version.phpファイルを設置します。
  3. 普通にXoopsの管理者メニューからモジュールのインストールを実施します。
  4. 必要に応じてユーザグループ管理で一般ユーザ、ゲストへのアクセス権を設定します。
注意点としてファイルのエンコーディングがEUCである必要がありました。
ポータルに設置してみましたが、なかなか便利です。



使い方は簡単です。

例えば、Yahoo!のパスワードを作りたいとします。
自分が暗記するパスワードをpasswordだとします。

そうすると
パスフレーズにpasswordと入力して
サイトにwww.yahoo.co.jpと入力して
送信をクリックします。

画面にパスワード(YjM3YWNjZjg2ZjZiYWRiN2ZkZjA5Yzc4MmUyNjJiNzk=)が表示されますので、好きな文字数を切り取ってパスワードにします。

これで、色々なサイトのパスワードをそれぞれ変更しつつ自分が覚えるパスフレーズは1つのみです。
万一、どこかのサイトでパスワードが漏れた場合でも非可逆なのでパスフレーズがばれる可能性は非常に低くなります。

弱点としては
  • 非可逆関数のmd5が既に破られていること。
  • パスフレーズを忘れた場合に手の施しようが無いこと。
md5ではなくsha-1関数なんか使うと強度は上げられます。
パスフレーズを忘れた場合は・・・無理ですね。