Tuesday, April 12, 2011

Digest認証用の.htdigestファイルを作る

Webサーバーの認証方式として古くから使われているBasic認証。これの次世代版に、より安全な認証が行えるDigest認証があります。

今回この認証で使用するパスワードファイル(.htdigest)を生成する必要があったのですが、諸事情で普通使われるツール“htdigest”(こっちは頭のピリオドがない)が利用できませんでした。そこで思い切って.htdigestを生成するツールを作ってみました。

.htdigest 生成ツール

.htdigest 生成ツール

自由にご利用ください。

ご利用方法

  1. .htdigest 生成ツール を開きます。
  2. テキストボックスに username:realm:password の形式で、ユーザーごとに改行して入力してください。
  3. [生成してダウンロード] をクリックすると、.htdigestが生成され htdigest.txt ファイルとしてダウンロードされます。
  4. これをサーバーの適切な箇所にアップロードし .htdigest にリネームしてください。

Tips: realm (レルム; 認証領域) は任意の値を指定でき、認証領域の識別に利用されます。具体的には.htaccessなどでDigest認証を設定するときにAuthNameで指定した値と関連しており、AuthNameとrealmが一致したユーザーのみ認証を通過できます。
realmはクライアントの認証画面に表示されます (サンプル; この場合realmはtest)。

自作

ツールの性質上、内容の漏洩等セキュリティーリスクには十分配慮して設計しています。
どうしても不安だという方は以下に.htdigestの生成方法に関して記しておきますので、これをご参考に自作ください。

.htdigestの構造

.htdigestは、.htpasswd(Basic認証のパスワードファイル)と同じくテキストファイルです。
その書式は以下のようになっています。

username:realm:MD5(username:realm:password)
PHPでの実装
function htdigest($user, $passwd, $realm='Restricted Area'){
    if((string) $user === '' || (string) $realm === '' || (string) $passwd === '' || preg_match('/[:\n\r]/', $user.$realm)) return null;
    $prefix = $user .':'. $realm .':';
    return $prefix . md5($prefix.$passwd);
}

echo htdigest('USERNAME', 'PASSWORD', 'REALM');
Perlでの実装
use Digest::MD5 qw(md5_hex);

sub htdigest(\$\$;\$){
    my($user, $passwd, $realm) = (shift, shift, shift || 'Restricted Area');
    if($user=='' || $passwd=='' || ($user.$realm) =~ /[:\n\r]/) return;
    $prefix = $user .':'. $realm .':';
    return $prefix . md5_hex($prefix.$passwd);
}

print &htdigest('USERNAME', 'PASSWORD', 'REALM');

Digest::MD5モジュールを使用しています。このモジュールが利用できないときはDigest::MD5::Perlなどで代用できます。

Note: このコードは動作検証していません。

Javascriptでの実装
<script type="text/javascript" src="md5.js"></script>
<script type="text/javascript">
    function htdigest(user, passwd, realm){
        if(realm=='') realm = 'Restricted Area';
        if(user=='' || passwd=='' || (user+realm).match(/[:\n\r]/)) return;
        prefix = user +':'+ realm +':';
        return prefix + MD5_hexhash(prefix+passwd);
    }

    alert( htdigest('USERNAME', 'PASSWORD', 'REALM'));
</script>

JavascriptにはMD5を扱えるビルトイン関数が無いため、「高度なJavaScript技集」のmd5.jsを使用しています。

Note: このコードは動作検証していません。

No comments:

Post a Comment