Perlモジュールで暗号化 - Crypt::SaltedHash編
Digest::MD5、Digest::SHA-1の2つを解説して、暗号・照合のコード例を書いたところで、saltを自動的に付加して暗号化し、さらに照合する関数まで持ったPerlモジュールが存在していることを知りました。オーノーであります。
ただし、標準モジュールではないため、各自でインストールが必要です。
標準モジュールではないモジュールのインストール方法については、【コラム】Perlモジュールの組み込みをご覧ください。
暗号化のためのモジュールとして便利なツールですので、以下にCrypt::SaltedHashモジュールについて触れておきます。
8-1. デモ
Crypt::SaltedHashのデモです。文字列をSHA-1形式、salt4文字、Base64形式で出力します。
8-2. Crypt::SaltedHashモジュール
Crypt::SaltedHashモジュールは、他のアルゴリズムインターフェースと連携して、ランダムなsaltを自動的に生成して暗号とその照合を行います。
デフォルトはSHA-1ですが、その他にもMD5やSHA-256, SHA-384等にも対応しています。
あくまでも単体では動作はせず、Digest::SHA-1モジュール等と連携し、暗号・照合処理を便利に利用するための補完ツールです。
あくまでも単体では動作はせず、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'); |
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
8-4. 【コラム】Perlモジュールの組み込み
標準モジュールではないモジュールを利用する場合には、サーバへ個別にインストールする必要があります。
サーバへ何らかのソフトウェアをインストールするには、原則としてroot権(管理者権限)を持った者がインストールする必要があります。
しかしながら、一般のレンタルサーバやプロバイダのサーバを利用している場合には、root権限までないため、難しい状況になります。
サーバへ何らかのソフトウェアをインストールするには、原則としてroot権(管理者権限)を持った者がインストールする必要があります。
しかしながら、一般のレンタルサーバやプロバイダのサーバを利用している場合には、root権限までないため、難しい状況になります。
そこで、Perlモジュールを、root権限のない状況で、組み込む方法をご紹介します。
ただし、ここでご紹介する方法は、モジュールがPurePerlであるものに限ります (*1) 。
ただし、ここでご紹介する方法は、モジュールがPurePerlであるものに限ります (*1) 。
(1) 組み込み方の基本
たとえば、組み込むモジュール名を、Fooとします。 この場合、モジュールファイルは、Foo.pmになります(モジュールは、このように、拡張子が .pmになっています)。
CGIを実行するフォルダの直下に、libフォルダを作成して、Foo.pmをそこへ入れます。
たとえば、組み込むモジュール名を、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となります。設置する場合も、階層式に設置します。
たとえば、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モジュールがアップされているライブラリで、利用者は自由にダウンロードすることができる場です。
Perlモジュールは、cpanにアップロードされていますので、検索してダウンロードします。
cpanとは、世界中のほとんどのPerlモジュールがアップされているライブラリで、利用者は自由にダウンロードすることができる場です。
本章のCrypt::SaltedHashは、以下にあります。
Downloadをクリックすると、書庫ファイル(tar.gz圧縮されています)がダウンロードが開始されます。
また、Browseをクリックすると、任意のファイルを個別にダウンロードすることができます。
また、Browseをクリックすると、任意のファイルを個別にダウンロードすることができます。
tar.gzファイルは、UNIX形式の書庫ファイルですが、以下のツール(どちらでもよい)を使用することで、Windowsでも解凍することができます。
tar.gzファイルをダウンロードし、解凍した場合には、諸々のファイルが同梱されていますが、必要なのは、.pmファイルです。
Crypt::SaltedHashの場合だと、lib/Crypt/SaltedHash.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;
【脚注】
*1 : Perlモジュールには、全てをPerlのみでコーディングされたもの(これをPurePerlといいます)と、本体部分をC言語でコーディングされ、Perlでその接続部分をコーディングされたもの(C + Perl)があります。
*1 : Perlモジュールには、全てをPerlのみでコーディングされたもの(これをPurePerlといいます)と、本体部分をC言語でコーディングされ、Perlでその接続部分をコーディングされたもの(C + Perl)があります。