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