Perlモジュールで暗号化 - Crypt::SaltedHash編
Digest::MD5、Digest::SHA-1の2つを解説して、暗号・照合のコード例を書いたところで、saltを自動的に付加して暗号化し、さらに照合する関数まで持ったPerlモジュールが存在していることを知りました。オーノーであります。ムンク叫び
ただし、標準モジュールではないため、各自でインストールが必要です。 標準モジュールではないモジュールのインストール方法については、【コラム】Perlモジュールの組み込みをご覧ください。
暗号化のためのモジュールとして便利なツールですので、以下にCrypt::SaltedHashモジュールについて触れておきます。

8-1. デモ

Crypt::SaltedHashのデモです。文字列をSHA-1形式、salt4文字、Base64形式で出力します。
pagetop

8-2. Crypt::SaltedHashモジュール

Crypt::SaltedHashモジュールは、他のアルゴリズムインターフェースと連携して、ランダムなsaltを自動的に生成して暗号とその照合を行います。
デフォルトはSHA-1ですが、その他にもMD5やSHA-256, SHA-384等にも対応しています。
あくまでも単体では動作はせず、Digest::SHA-1モジュール等と連携し、暗号・照合処理を便利に利用するための補完ツールです。
概 要 (cpanより)
use Crypt::SaltedHash;

my $csh = Crypt::SaltedHash->new(algorithm => 'SHA-1');
$csh->add('secret');

my $salted = $csh->generate;
my $valid = Crypt::SaltedHash->validate($salted, 'secret');
pagetop

8-3. 暗号と照合

暗号化のコード例は次のとおりです。
use strict;

# モジュールを宣言
use Crypt::SaltedHash;

# 文字列
my $passwd = 'password';

# オブジェクト定義
my $csh = Crypt::SaltedHash->new();
$csh->add($passwd);

# 暗号化
my $crypt = $csh->generate;
print "$crypt\n";
>  {SSHA}Z0a89YcM7fV4Pxl7wkF+3+7y/b4cxFb/
デフォルトで、SHA-1形式、salt4文字、出力形式はBase64のようです。
オプションで、アルゴリズムやsaltの文字数を指定することができます。 たとえば、アルゴリズムを MD5形式、saltを8文字で指定する場合は、new()メソッドに対して、次のようにオプション指定します。
use strict;

# モジュールを宣言
use Crypt::SaltedHash;

# 文字列
my $passwd = 'password';

# オブジェクト定義 + オプション指定
my $csh = Crypt::SaltedHash->new(
		algorithm => 'MD5',  # MD5形式
		salt_len  => 8,      # salt文字数
	);
$csh->add($passwd);

# 暗号化
my $crypt = $csh->generate;
print "$crypt\n";
>  {SMD5}J1QGWc5/ARLOqgLarLbRYBjKZ9d4GAVv
また、照合に関しては、valid関数が用意されています。
構文
Crypt::SaltedHash->validate('暗号文字列', 'パスワード');
内容 照合されたら返り値「1」。照合されない場合は返り値「ヌル」
照合のためのコード例は、次のとおりです。
use strict;

# モジュールを宣言
use Crypt::SaltedHash;

# 文字列
my $passwd = 'password';

# 暗号文字
my $crypt = '{SSHA}Z0a89YcM7fV4Pxl7wkF+3+7y/b4cxFb/';

# 判定
my $valid = Crypt::SaltedHash->validate($crypt, $passwd);
if ($valid) {
	print "OK\n";
} else {
	print "NG\n";
}
>  OK
上記の暗号/照合コードを、まとめてみましょう。
use strict;

# モジュールを宣言
use Crypt::SaltedHash;

# 文字列
my $passwd = 'password';

# 暗号
my $crypt = &encrypt($passwd);
print "$crypt\n";

# 照合
if (Crypt::SaltedHash->validate($crypt, $passwd)) {
	print "OK\n";
} else {
	print "NG\n";
}

#-----------------------------------------------------------
#  Crypt::SaltedHash暗号
#-----------------------------------------------------------
sub encrypt {
	my $plain = shift;

	# オブジェクト定義
	my $csh = Crypt::SaltedHash->new();
	$csh->add($plain);

	# 暗号化
	return $csh->generate;
}
>  {SSHA}DW9lZwVZMu0sN6VK5q6asPthnzv1LMuS
>  OK
pagetop

8-4. 【コラム】Perlモジュールの組み込み

標準モジュールではないモジュールを利用する場合には、サーバへ個別にインストールする必要があります。
サーバへ何らかのソフトウェアをインストールするには、原則としてroot権(管理者権限)を持った者がインストールする必要があります。
しかしながら、一般のレンタルサーバやプロバイダのサーバを利用している場合には、root権限までないため、難しい状況になります。
そこで、Perlモジュールを、root権限のない状況で、組み込む方法をご紹介します。
ただし、ここでご紹介する方法は、モジュールがPurePerlであるものに限ります (*1) 。
(1) 組み込み方の基本
たとえば、組み込むモジュール名を、Fooとします。 この場合、モジュールファイルは、Foo.pmになります(モジュールは、このように、拡張子が .pmになっています)。
CGIを実行するフォルダの直下に、libフォルダを作成して、Foo.pmをそこへ入れます。
/homepage
   |
   +-- cgi / crypt.cgi ← CGIプログラム
        |
        +-- lib / Foo.pm ← ここに置く(Fooモジュール)
そして、CGIプログラムを crypt.cgi としたとき、プログラム中に以下のように定義します。
use lib "./lib";
use Foo;
use lib とは、任意のフォルダを、Perlモジュールの対象フォルダとするためのものです。
また、モジュールには、フォルダ階層になっているものがあります。階層式は、フォルダ部分をコロン2つで表記します。
たとえば、Foo::Barモジュールであれば、ファイルは、Foo/Bar.pmとなります。設置する場合も、階層式に設置します。
/homepage
   |
   +-- cgi / crypt.cgi ← CGIプログラム
        |
        +-- lib /
             |
             +-- Foo / Bar.pm ← ここに置く(Foo:Barモジュール)
CGIプログラム側からのコールは、次のように記述します。
use lib "./lib";
use Foo::Bar;
(2) モジュールの入手方法
Perlモジュールは、cpanにアップロードされていますので、検索してダウンロードします。
cpanとは、世界中のほとんどのPerlモジュールがアップされているライブラリで、利用者は自由にダウンロードすることができる場です。
http://www.cpan.org/
本章のCrypt::SaltedHashは、以下にあります。
http://search.cpan.org/~gshank/Crypt-SaltedHash-0.09/
Downloadをクリックすると、書庫ファイル(tar.gz圧縮されています)がダウンロードが開始されます。
また、Browseをクリックすると、任意のファイルを個別にダウンロードすることができます。
tar.gzファイルは、UNIX形式の書庫ファイルですが、以下のツール(どちらでもよい)を使用することで、Windowsでも解凍することができます。
Lhaplus     +Lhaca
tar.gzファイルをダウンロードし、解凍した場合には、諸々のファイルが同梱されていますが、必要なのは、.pmファイルです。
Crypt::SaltedHashの場合だと、lib/Crypt/SaltedHash.pmがそれに当ります。
/homepage
   |
   +-- cgi / crypt.cgi ← CGIプログラム
        |
        +-- lib /
             |
             +-- Crypt / SaltedHash.pm ← ここに置く(Crypt::SaltedHashモジュール)
CGIプログラム側からのコールは、次のように記述します。
use lib "./lib";
use Crypt::SaltedHash;
pagetop
【脚注】
*1 : Perlモジュールには、全てをPerlのみでコーディングされたもの(これをPurePerlといいます)と、本体部分をC言語でコーディングされ、Perlでその接続部分をコーディングされたもの(C + Perl)があります。