openldap付属?のslappasswdを使えば、一方向暗号化できますが、openldapのない環境で暗号化されたパスワードの検証を行います。
slappasswdコマンドによる暗号化例
$ /usr/local/openldap/sbin/slappasswd -h {SSHA} -s test1000
{SSHA}fmKMNIgNiflUKsSiODSENudKz8Sq0qDZ
※ SSHAは実行毎に生成される文字列が異なります
$ /usr/local/openldap/sbin/slappasswd -h {SHA} -s PASSWORDTEXT
{SHA}rYlTHwKi2j1/Q99fJq4BGLvPOUE=
$ /usr/local/openldap/sbin/slappasswd -h {MD5} -s PASSWORDTEXT
{MD5}tapl5YhfLMcw2tx/bvZP/g==http://search.cpan.org/perldoc?Crypt%3A%3ASaltedHash
↑こちらのCrypt::SaltedHashを使えば、以下のようなscriptで実現できます。
#!/usr/local/bin/perl use strict; use Crypt::SaltedHash; use Data::Dumper; # slappasswdコマンドによる暗号化例 # $ /usr/local/openldap/sbin/slappasswd -h {SSHA} -s test1000 # {SSHA}u9FZZxp0m9jOqRIlLNpBkn37uu1lR+BX main(); sub main { my $secret = 'test1000'; my $i = 0; my @salted_list; #暗号化 ※同じパスワードでも暗号化結果は、実行毎に異なります while ($i++ < 10){ my $shash = Crypt::SaltedHash->new(algorithm => 'SHA-1'); $shash->add($secret); my $salted = $shash->generate; push(@salted_list,$salted); sleep(2); } #検証 for my $salted (@salted_list){ my $shash = Crypt::SaltedHash->new(algorithm => 'SHA-1'); $shash->add($secret); my $valid = Crypt::SaltedHash->validate($salted,$secret); print "$salted -> $valid\n"; } }
実行結果 (1 means valid .)
$ ./foo.pl
{SSHA}nZwNw46W8LHPUbZsiJP7vPxl/2pKyvLM -> 1
{SSHA}xOV+X/U4XmvKW+c+eURInsWsHx+XCqc6 -> 1
{SSHA}AxliSqhX6PUJpCepVBYl2+B+gRrTx8Ea -> 1
{SSHA}uIGivxJTQJ9ErK95lehb/L8z4F1Yq8um -> 1
{SSHA}bpi/+oR6nHzYQ6/3Hg4DYx78z9tDx/x2 -> 1
{SSHA}8m+GgEOF1hiusTInDef2SmO23aqA24Bq -> 1
{SSHA}MasGee5qYcmpphzEpmMRFAyj9G2F1yXh -> 1
{SSHA}Uzc06iZF2qIpjV3vG9D3bvJHSX6j8aZz -> 1
{SSHA}AhSMRX0nu/E33JXINjdJ1kqR0kjHU/gW -> 1
{SSHA}EwZWsVp4yjk/tTEgESqZFsrB0/2ZGM5x -> 1