end0tknr's kipple - 新web写経開発

http://d.hatena.ne.jp/end0tknr/ から移転しました

perlのCrypt::SaltedHashによるSSHA暗号化と、パスワード検証

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