Basic/Digest認証用ハッシュ生成ツール

JavaScriptを用いて(←ここ重要)、Basic認証およびDigest認証用のハッシュを作ります。

Input
User
Realm
Password
Salt
Basic Authentication
Crypt
htpasswd
Digest Authentication
Digest
htdigest

項目の説明

User
ユーザー名です。
Realm
レルム、認証領域の名前です。Digest認証で必要です。
Password
パスワードです。Basic認証の場合、最初の8文字しか有効になりません。Digest認証の場合は全文字有効です。
Salt
ハッシュの精度を上げるための文字列です。Basic認証で必要です。最初の2文字のみ使用されます。2文字に足りない分はランダムに補われます。
Crypt
Basic認証用に生成されたハッシュです。
htpasswd
.htpasswdファイルに記述する行です。
Digest
Digest認証用に生成されたハッシュです。
htdigest
.htdigestファイルに記述する行です。

Basic認証、Digest認証って何?

ユーザー名とパスワードでログインするための方法の一種、とでもいいましょうか。おおざっぱにいえばそんな感じです。

Basic認証は認証のためパスワードを送信します。一方、Digest認証はパスワードそのものは送信せず、パスワードチェック用の文字列を送信します。いずれもパスワードの「暗号化」は行いませんが、Digest認証のほうが比較的安全です。

詳しいことはご自分でお調べください。

なぜJavaScriptを使っている?

  1. クライアントサイドで動作すること
  2. ソースコードを確認できること
  3. 普及率が高いこと

以上の要件を満たしていることが主な理由です。

1.については、この要件が必要になる理由がまた複数あります。

サーバーサイドで動作するものだと、この2つの要件が満たせません。

もしサーバー上で動作させてしまうと、私が仮に悪人だったとき、サーバー側のプログラムにこっそりパスワードを抜き取るコードを書くかもしれません。そうなってしまっても、あなたは生成されたハッシュしかわからず、パスワードが盗まれたことには気づきようがありません。え、私が悪人じゃないと?うれしいなあ、でも金融機関とかのパスワードだったりしたら、「良い人」でも心が動いちゃいますよ。

私に全幅の信頼をおいていたとしても、ネットワークはそうもいきません。パスワードがどの経路をたどってサーバーまでたどり着くかわかったものじゃありません。途中で誰かにパスワードを拾われるかもしれません。SSL等、暗号化通信を行えばこの点は解決なのですが、残念ながら私のサーバーではSSLを使っておりません。

SSL(よりさらに新しいTLS)を導入しました。通信路に関しては安全が確保されたといえるでしょう。これからの時代、特にセキュリティを求められなくとも、セキュアな通信が当たり前になっていくことと思われます(と、期待しています)。

逆に、クライアントサイドで動作するのであれば、情報を送信するプログラムを書かない限りどこにも情報は送信されませんし、送信されていない情報を使ってサーバーが処理するのも当然できないわけです。私が悪人でも、ネットワーク上でパスワードを探している人がいても、その人たちにパスワードがばれる心配はありません。

でも、せっかくクライアントサイドで動いても、そのプログラムにパスワードを送信するコードが埋め込まれていればすべてが台無しです。そのような悪意のコードが含まれていないことを確認するために必要なのが、2.の要件です。

JavaScriptのプログラムは基本的にソースコードの状態で提供され、このツールもまた例外ではありません。不安な方は実際にソースコードを見て確認するとよいでしょう。

3.については、広く使っていただきたいという、ただそれだけの話です。また、ネット上で見つけてそのまま使えるという点は、ダウンロードソフトにはない利点です。

このツールは安全と考えていいの?

このツールは安全です。

しかし、あなたの使い方次第では安全性に問題が発生することもあるでしょう。以下に危険な例をいくつか挙げます。

  1. クリップボード経由でパスワードを張り付ける。また、クリップボードにパスワードを残したままにする。
  2. セキュリティ上問題があるコンピューターで本ツールを使う。特に、キーロガーの設置されたコンピューターを用いる。
  3. パスワードそのものにすでに問題がある。単純な単語や氏名、電話番号、メールアドレスに一致するものなど。
  4. 本ツールを改変して使う。ただし改変内容によってはこの限りではない。

特に2.に関しては本ツールは全く想定していないため、ご自分のパスワードはご自分で守る必要があります。本ツールはあなたのパスワードを悪用しませんが、保護もしません。

他のツールは使っちゃいけない?

とんでもない。

たとえばApacheに同梱されているhtpasswdコマンドやhtdigestコマンドが使えるならば、絶対にそちらを使った方が良いでしょう。オープンソースで開発されており、充分なテストを受けているため、私のツールと比べて非常に信頼性が高いといえます。ただし、リモートのサーバーでこれらのコマンドを使う場合は、SSHなどのセキュアな通信を用い、信頼できるサーバーで実行することが最低条件でしょう。

一方、使うのを避けるべきツールもあります。

それは主に、上述の要件1.と2.を満たしていないものです。

素性のわからない人のWebサイト上にある、素性のわからない人が作ったPHPやCGIに、単なるHTTP通信で、生のままのパスワードを送信するようなツールなんて、もってのほかです。

そんな危ないツールあるわけないと思いますか?Googleで「htpasswd 生成」を検索した結果(2011/04/08現在)の上位4件はすべて上記要件を満たしていませんでした。何をするか確認できないプログラムに、Base64変換すらされていない完全に生のままのパスワードが送信されます。

htdigest用のツールは数が少なかったのですが、やはり同じ問題を抱えているものがありました。

もちろん、そういった問題のあるツールであっても、セキュリティと何の関係もない、たとえばテスト用に作った「password」というパスワードなどをハッシュ化するのであれば、有用ではあるでしょう。私もそういう用途になら便利に使っていました。

免責事項

本ツールを使用したことによるいかなる損害にも当方は責任を負いかねます。ご自身の責任においてご利用ください。重ねて言いますが、本ツールはあなたのパスワードを悪用しませんが、保護もしません

謝辞

本ツールの作成にあたり、以下のライブラリを使用させていただきました。ありがとうございました。

  1. jQuery
  2. MD5
  3. crypt