end0tknr's kipple - web写経開発

太宰府天満宮の狛犬って、妙にカワイイ

ldap の slappasswd -h {MD5|SHA|SSHA} -s $pw_org の clone を perlで実装

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;
}