[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