ホームページを作る上で、特定の人にだけ見せたいページが出てくるでしょう。そのようなページでよく、アカウントとパスワードを入れさせるページを見たことがあると思います。これを「Basic 認証」と呼びます。ブラウザーによって認証画面が異なります。

Internet Explorer 6 (on Windows XP) の場合

Internet Explorer 6 (on Windows XP) の場合

Internet Explorer 5 の場合

Internet Explorer 5 ?????‡

Netscape 4 の場合

Netscape 4 ?????‡

Netscape 6 の場合

Netscape 6 ?????‡

Mozilla 0.9.7 の場合

Mozilla 0.9.7 ?????‡

Opera 6.0 の場合

Opera 6.0 ?????‡

 

実際に、お使いのブラウザーではどのような画面がでるかを、こちらでお試しください。

この Basic 認証は、「.htaccess」と「.htpasswd」いうファイルに記述すれば実現することができます。Basic 認証は、ページにかけるものではありません。ディレクトリに対して制限をかけます。したがって、「.htaccess」をおいたディレクトリ配下のすべてのコンテンツに対して制限がかかります。

記述例

AuthUserFile /home/futomi/.htpasswd
AuthGroupFile /dev/null
AuthName "Secret Area"
AuthType Basic

require valid-user

<Files ~ "^.(htpasswd|htaccess)$">
    deny from all
</Files>
-----(1)

-----(2)




-----(3)

番号を振ってある行について説明します。この部分が、環境に合わせて書き換えなければいけません。その他の行については、そのまま書き加えてください。

(1) AuthUserFile

パスワードファイルの指定です。ここでの指定は、サーバのルートディレクトリからのフルパスで記述しなければいけません。

(2) AuthName

Basic 認証をかける領域名の指定です。上の図の例では、「Secret Area」の部分です。"(ダブルクォーテーション)」で囲まれた部分は、自由に書き換えてください。ただし、「"(ダブルクォーテーション)」は入れないでください。

(3) Files

これは、なくても問題ありません。ただし、「.htaccess」や「.htpasswd」はやはり見せたくありません。そのために、この記述を加えることをお勧めします。

記述例

futomi:FeNpx1.147CVA 
master:X6ntcZ021IxMw

.htpasswd に記載される情報は、アカウント名とパスワードです。アカウント名とパスワードは「:(コロン)」で区切られます。複数のアカウントを指定する場合には、改行をして次の行に記述します。パスワードについては、暗号化された状態で保存される必要があります。暗号化は、何かしらツールが必要なのですが、ここでは、パスワードを入れたら、暗号化された文字列を出力する CGI を提供します。

パスワードを入れてください 

パスワードの暗号化は、UNIX のパスワードの暗号化と同じです。この手の内容のホームページでしばしば、"Base64で暗号化" と書いてあるページを見かけたことがありますが、これは間違いです。

ちなみに Base64 は暗号化ではありまあせん。符号化といったほうが正しいかと思います。ただし、ブラウザーからサーバへリクエストをする際には、アカウント、パスワードともに、Base64 で符号化されて送信されます。これは HTTP/1.1 で規定されています。

Base64 で符号化された文字は、簡単に元に戻せます。しかし、UNIX のパスワードの暗号化は、簡単には戻せません。つまり、暗号化された文字列を発見されたとしても、すぐにはパスワードを解析することができないのです。しかし不可能ではありません。したがって、あなたに関係する言葉をパスワードにすることは、暗号化されたパスワードを解析しようとする悪意のあるクラッカーの手間を省くこととなります。それを防ぐためにも、「.htpasswd」ファイルは、見ることができないようにする必要性があります。

さて、話は元に戻って、Perl で、パスワードを暗号化するにはどうしたらいいのでしょう。実は非常に簡単なスクリプトを組むだけで実現できます。

Perlの関数「crypt」を使って暗号化します。関数「crypt」の使い方は、以下のとおりです。

crypt(PLAINTEXT, SALT)

「PLAINTEXT」の部分は、暗号化したい文字列です。「SALT」の部分は、大文字・小文字アルファベットと 0 〜 9 の数字、そして、「.(ドット)」「/(スラッシュ)」のいづれか2文字です。「SALT」は、暗号化する際のキーとなるもので、「PLAINTEXT」が文字列でも、「SALT」を変えることによって暗号化文字列が異なってきます。つまり同じ「PLAINTEXT」に対して、4096 通りの暗号化パスワードが生成しうるわけです。

「SALT」は、固定で決めてしまってもいいのですが、できる限り複雑にするために、生成するたびに、ランダムな文字列を指定します。いろいろな方法があるかと思いますが、ここでは、ただ単に rand 関数を使います。

#!/usr/local/bin/perl

use CGI;
$| = 1;
$query = new CGI;
$pass = $query->param('PASS');
$encpass = &encrypt_passwd($pass);

print "Content-type: text/html\n\n";
print '<table border="1">',"\n";
print "<tr><td>パスワード</td><td><tt>$pass</tt></td></tr>\n";
print "<tr><td>暗号化パスワード</td><td><tt>$encpass</tt></td></tr>\n";
print "</table>\n";

exit;

sub encrypt_passwd {
	my($pass)=@_;
	my(@salt_set)=('a'..'z','A'..'Z','0'..'9','.','/');
	srand;
	my($seed1) = int(rand(64));
	my($seed2) = int(rand(64));
	my($salt) = $salt_set[$seed1] . $salt_set[$seed2];
	return crypt($pass,$salt);
}

戻る

会社案内 | 特定商取引法に基づく表示 | プライバシーポリシー | 当サイトへのリンクについて | お問い合わせ