パスワードをテキストのまま生で保存するのはセキュリティ上望ましくありません。Perlにはパスワードを暗号化するcrypt関数が用意されています。
にしし ふぁくとりー

にししの Perl/CGI Tips ふぁくとりー

にししふぁくとりーPerl/CGI Tips → このページ

セキュリティ関連TIPS

パスワードを暗号化して保存するには?

管理者用パスワード、アクセス用パスワードなど、CGIでパスワードを保存したいことがあります。 パスワードをテキストのまま生で保存するのは、セキュリティ上望ましくありませんね。 Perlには、パスワードを暗号化するための crypt 関数が用意されています。

Perl SOURCE 1

Perlでパスワード文字列を暗号化するのは非常に簡単で、crypt関数を利用するだけです。 この関数は、オリジナルのパスワードと、暗号化キー(任意の2文字)の2つの引数を取ります。
$enciphered = crypt( $password, $key );
上記の例では、変数 $password に元のパスワード文字列を、変数 $key に暗号化キー(任意の1バイト文字2つ)を指定します。 すると、暗号化された結果が、変数 $enciphered に格納されます。

補足

この関数の処理は一方向で、暗号化した文字列を復号化することはできません。 つまり、暗号化された文字列からオリジナルのパスワードを解読することはできません。
ですから、「ユーザから入力されたパスワードが、保存されている正しいパスワードと一致するかどうか」の処理は、 「保存してある暗号化パスワードを復号化してチェック」するのではなく、「ユーザが入力した文字列を同様に暗号化してみて、暗号化結果が一致しているかどうか」で行います。

また、暗号化にはキーが必要です。これは2文字(1バイト文字2つ)の任意の文字を指定します。省略すれば「AA」が使われるようです。
この暗号化キーは、暗号化された文字列の先頭にも付加されます。例えば、暗号化した結果「fx7zqpY1t/yBM」という文字列が生成されたなら、先頭2文字の「fx」が暗号化キーです。 crypt関数の第2引数(暗号化キー)には、この暗号化された文字列をそのまま渡すことができます。余分な3文字目以降の文字列は無視されますので。

その例を以下に紹介します。

Perl SOURCE 2

既に暗号化して保存してあるパスワードと、ユーザが入力したパスワードが一致しているかどうかを判断するには、次のような感じにすれば良いでしょう。
$savedpass = "fx7zqpY1t/yBM"; # 保存されている暗号化済みパスワード
$userpass  = "1234"; # ユーザが入力したパスワード

if( crypt( $userpass, $savedpass ) eq $savedpass ) {
   print "パスワードは一致しました。\n";
}
else {
   print "パスワードが違います。\n";
}
上記のcrypt関数の第1引数には、ユーザが入力したパスワードを、第2引数には、保存されている暗号化されたパスワードを渡しています。(第2引数には暗号化キーを渡す必要があり、それは保存されている保存されている暗号化されたパスワードの先頭2文字です。)
そして、得られた結果を、保存されている暗号化されたパスワードと比較しています。

SAMPLE SOURCE

ソースコード20 , 出力結果20
2004/03/10. Wed.

このページに記載の内容は、必ずしも正しいとは限りません。ご注意下さい。
もっと良い方法がありましたら、ぜひ、教えて頂けるとありがたいです。
製作者にししへのご連絡は、メールなどでお送り下さい。匿名のコメントも送信できます。
どのページへもリンクは歓迎します。複製・転載はご遠慮下さい。