Perl入門ゼミ

テキスト処理、Linuxサーバー管理、Web開発ならPerl
  1. Perl
  2. 標準関数
  3. here

crypt関数 - ダイジェストを作成してパスワードの照合を行う

crypt関数を使うと、パスワードをダイジェストにして保存しておくことができます。パスワードを平文で保存しておくと見られてしまいます。第一引数はパスワードです。第二引数はサルトという任意の文字列で、ダイジェストを解読されにくくするためのものです。

my $digest = crypt($passwd, $salt);

ダイジェストの作成を行うなら現在ならばcrypt関数よりも、Digest::MD5Digest::SHAを使うのがお勧めです。

crypt関数のサンプル

crypt関数を使ったサンプルです。

use strict;
use warnings;

# パスワードを作成
# [./0-9A-Za-z] からなるランダムな2文字をsaltとして作成する
print "(1)パスワードからダイジェストを作成する。\n";
my $passwd = 'secret';
my $salt = join '' . ('.', '/', 0 .. 9, 'A' .. 'Z', 'a' .. 'z')[rand 64, rand 64];
             
my $digest = crypt($passwd, $salt);
print "$digest\n\n";


print "(2)パスワードの照合を行う。\n";
if (crypt($passwd, $digest) eq $digest) {
  print "パスワードが一致しました。\n";
}

パスワードからダイジェストを作成する

my $passwd = 'secret'; # パスワードを作成
my $salt = join '', ('.', '/', 0 .. 9, 'A' .. 'Z', 'a' .. 'z')[rand 64, rand 64];
my $digest = crypt($passwd, $salt);

パスワードからダイジェストを作成するにはcrypt関数を使用します。crypt関数は一方向ハッシュ関数です。一方向ハッシュによって変換された文字列をダイジェストと呼びます。

crypt関数によって作成されたダイジェストは複合することが非常に困難です。

cryptの第1引数には、ダイジェストの元になる文字列を指定します。最初の8バイトだけが意味を持ちます。それより長い文字は無視されます。

cryptの第2引数には、[./0-9A-Za-z]の64文字のうちの2文字を指定します。2文字目以降は無視されます。この64文字からランダムな2文字を選ぶようにするとダイジェストの安全性が高くなります。

作成されるダイジェストの先頭はこの2文字になります。

パスワードの照合を行う

if (crypt($passwd, $digest) eq $digest){ }

パスワードの照合を行うときは、crypt関数を使用して再びダイジェストを作成します。作成したダイジェストが、以前に作成されたダイジェストと一致すれば、正しいパスワードであることがわかります。

ダイジェストの先頭2文字には、$saltで指定された2文字ですから、crypt関数の第2引数にそのまま使用することができます。

Giblog