perlのCrypt::SaltedHashによるSSHA暗号化と、パスワード検証 - end0tknr's kipple - web写経開発
昔、書いた上記は、SSHAだけでしたので、SHA & MD5 も書いてみた。
#!/usr/local/bin/perl use strict; use Crypt::SaltedHash; use Digest::MD5; use Digest::SHA1; use MIME::Base64; use Data::Dumper; main(); sub main { # MD5やSHA1は、何回hash化しても、同じ値になります。 # よって、元PWをhash化し、文字列比較すればOK my $pw_org_1 = "PASSWORD1"; print dummy_slappasswd_md5($pw_org_1),"\n"; print dummy_slappasswd_sha1($pw_org_1),"\n"; # SSHAは、hash化毎に、異なる値になります。 # よって、Crypt::SaltedHash->validate() を利用する必要があります。 my $pw_org_2 = "PASSWORD2"; my $pw_ssha = dummy_slappasswd_ssha($pw_org_2); print "$pw_ssha\n"; my $pw_ssha_valid = validate_ssha($pw_ssha,$pw_org_2); print "$pw_ssha is '$pw_ssha_valid'\n"; } # = slappasswd -h {SSHA} -s $pw_org sub dummy_slappasswd_ssha { my ($pw_org) = @_; my $shash = Crypt::SaltedHash->new(algorithm => 'SHA-1'); $shash->add($pw_org); my $ret_pw = $shash->generate; return $ret_pw; } sub validate_ssha { my ($pw_ssha,$pw_org) = @_; my $shash = Crypt::SaltedHash->new(algorithm => 'SHA-1'); $shash->add($pw_org); my $valid = Crypt::SaltedHash->validate($pw_ssha,$pw_org); return $valid; } # = slappasswd -h {SHA} -s $pw_org sub dummy_slappasswd_sha1 { my ($pw_org) = @_; my $ctx = Digest::SHA1->new; $ctx->add($pw_org); my $ret_pw = "{SHA}".encode_base64($ctx->digest); chomp($ret_pw); return $ret_pw; } # = slappasswd -h {MD5} -s $pw_org sub dummy_slappasswd_md5 { my ($pw_org) = @_; my $ctx = Digest::MD5->new; $ctx->add($pw_org); my $ret_pw = "{MD5}".encode_base64($ctx->digest); chomp($ret_pw); return $ret_pw; }