Webサーバーの認証方式として古くから使われているBasic認証。これの次世代版に、より安全な認証が行えるDigest認証があります。
今回この認証で使用するパスワードファイル(.htdigest)を生成する必要があったのですが、諸事情で普通使われるツール“htdigest”(こっちは頭のピリオドがない)が利用できませんでした。そこで思い切って.htdigestを生成するツールを作ってみました。
.htdigest 生成ツール
自由にご利用ください。
ご利用方法
- .htdigest 生成ツール を開きます。
- テキストボックスに
username:realm:passwordの形式で、ユーザーごとに改行して入力してください。 - [生成してダウンロード] をクリックすると、.htdigestが生成され
htdigest.txtファイルとしてダウンロードされます。 - これをサーバーの適切な箇所にアップロードし
.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