[SP-pm] md5_base64
Carlos Eduardo Langoni
ce.langoni at gmail.com
Wed May 6 08:33:25 PDT 2009
Amigos,
Como disse inicialmente pra vocês estou iniciando em perl com o
objetivo de fazer algumas modificações em um sistema chamado nocat,
com o objetivo de integra-lo a uma solução que estou desenvolvendo.
O sistema está feito em php+mysql e o nocat em perl, no fim das contas
estou usando php, perl e shell script (com pretenção futura de remover
o shell e substituir por puro perl).
Tudo caminhava muito bem na parte de php e shell, até mesmo a parte
que eu precisaria mexer em perl já estava acertada, mas nada hora de
testar o sistema completo (essas coisas sempre acontecem no final)
tive problemas com a autenticação do usuário :( o nocat (perl) não
consegue interpretar a senha q eu salvo usando o php :(
Fuçando no fonte do nocat atrás de descobrir a forma de encriptação
utilizada (que inicialmente achei que fosse md5) eu encontrei uma
chamada a uma função chamada md5_base64.
Ele começa as referências a md5_base64 no começo do arquivo DBI.pm
onde encontro:
use Digest::MD5 qw( md5_base64 );
mais abaixo no mesmo arquivo eu encontro:
$user->set_password( md5_base64( $user->passwd ), 1 ) if
$user->changed_password;
(talvez eu esteja acostumado de mais com identação, mas esta linha não
fez mto sentido pra mim)
Esta linha faz parte do seguinte bloco:
sub check_password {
my ($self, $user) = @_;
# MD5 the password if it's not already MD5'd, prior to actually using it.
$user->set_password( md5_base64( $user->passwd ), 1 ) if
$user->changed_password;
return $user->passwd;
}
e depois ainda tem:
return md5_base64( $user_pw ) eq $stored_pw;
como parte do bloco:
sub authenticate_user {
my ($self, $user_pw, $user) = @_;
my $stored_pw = $self->check_password( $user );
return md5_base64( $user_pw ) eq $stored_pw;
}
Na primeira vez que analisei o código para ver qual o método de
encriptação era utilizado para as senhas eu acreditei que fosse md5,
mas depois percebi que o hash gerado por ele não se parece em nada com
md5, aí encontrei a função crypt como parte do seguinte bloco:
sub md5_hash {
my ( $self, $string, $salt ) = @_;
unless ( $salt ) {
my @chars = ( "0".."9", "a".."z", "A".."Z", ".", "/" );
$salt = "";
$salt .= @chars[int rand @chars] for ( 1 .. 8 );
}
$salt = '$1$' . substr( $salt, 0, 8 ) if $salt !~ /^\$1\$/o;
return crypt( $string, $salt );
}
E analisando a url http://www.osix.net/modules/article/?id=571
acreditei que fosse DES-std, mas nenhuma das formas que testei com php
conseguiu gerar uma senha que o nocat conseguisse interpretar.
Uma coisa que me deixa encucado, sem entender direito, são esses IFs
na rente de linhas como $salt = '$1$' . substr( $salt, 0, 8 ) if
$salt !~ /^\$1\$/o;
Tem algum companheiro na lista que pode me ajudar a entender tudo isso?
Obrigado a todos desde já!
Abraços
Kadu
More information about the SaoPaulo-pm
mailing list