package Authen::Simple::Password;
use strict;
use warnings;
use Crypt::PasswdMD5 qw[];
use Digest::MD5 qw[];
use Digest::SHA qw[];
use MIME::Base64 qw[];
sub check {
my ( $class, $password, $encrypted ) = @_;
# Plain
return 1 if $password eq $encrypted;
# L S
# Des 13 2
# Extended DES 20 9
# $1$ MD5 34 12
# $2$ Blowfish 34 16
# $3$ NT-Hash ? ?
# Crypt
return 1 if crypt( $password, $encrypted ) eq $encrypted;
# Crypt Modular Format
if ( $encrypted =~ /^\$(\w+)\$/ ) {
return 1 if $class->_check_modular( $password, $encrypted, lc($1) );
}
# LDAP Format
if ( $encrypted =~ /^\{(\w+)\}/ ) {
return 1 if $class->_check_ldap( $password, $encrypted, lc($1) );
}
# MD5
if ( length($encrypted) == 16 ) {
return 1 if Digest::MD5::md5($password) eq $encrypted;
}
if ( length($encrypted) == 22 ) {
return 1 if Digest::MD5::md5_base64($password) eq $encrypted;
}
if ( length($encrypted) == 32 ) {
return 1 if Digest::MD5::md5_hex($password) eq $encrypted;
}
# SHA-1
if ( length($encrypted) == 20 ) {
return 1 if Digest::SHA::sha1($password) eq $encrypted;
}
if ( length($encrypted) == 27 ) {
return 1 if Digest::SHA::sha1_base64($password) eq $encrypted;
}
if ( length($encrypted) == 40 ) {
return 1 if Digest::SHA::sha1_hex($password) eq $encrypted;
}
# SHA-2 256
if ( length($encrypted) == 32 ) {
return 1 if Digest::SHA::sha256($password) eq $encrypted;
}
if ( length($encrypted) == 43 ) {
return 1 if Digest::SHA::sha256_base64($password) eq $encrypted;
}
if ( length($encrypted) == 64 ) {
return 1 if Digest::SHA::sha256_hex($password) eq $encrypted;
}
return 0;
}
sub _check_ldap {
my ( $class, $password, $encrypted, $scheme ) = @_;
if ( $scheme eq 'cleartext' ) {
my $hash = substr( $encrypted, 11 );
return 1 if $password eq $hash;
}
if ( $scheme eq 'crypt' ) {
my $hash = substr( $encrypted, 7 );
return 1 if crypt( $password, $hash ) eq $hash;
}
if ( $scheme eq 'md5' ) {
my $hash = MIME::Base64::decode( substr( $encrypted, 5 ) );
return 1 if Digest::MD5::md5($password) eq $hash;
}
if ( $scheme eq 'smd5' ) {
my $hash = MIME::Base64::decode( substr( $encrypted, 6 ) );
my $salt = substr( $hash, 16 );
return 1 if Digest::MD5::md5( $password, $salt ) . $salt eq $hash;
=1= |