Problema com md5()

17/07/2014

Oi turma, na minha tabela a senha está criptografada com md5(), criei uma variável $senha = md5($senha), quando faço a pesquisa retorna null, se a senha informada é válida porque está retornando null?

Se eu mudar a senha no banco de dados para senha123 sem criptografia ele retorna true, só retorna quando está criptografada e dei um print na tela comparando $senha == $item['senha'] as senha conferem. O que poderia está causado o erro na query?

$senha   = isset($_POST['senha']) ? $_POST['senha'] : '';

$senha = md5($senha);

            $sql = "SELECT *
                    FROM usuarios
                    WHERE
                        email = '$usuario'
                        AND
                        senha = '$senha'";

            $query     = pg_query($sql);
           
            $resultado = pg_fetch_all($query);
           
            $numRegistros = 0;

            foreach ($resultado as $link) {
                $numRegistros += !empty($link['email']) ? 1 : 0;
            }

            if ($query){
                pg_free_result($query);
            } else {
                // se a consulta for mal sucedida
                return false;
            }

            // se houver apenas um usuário, retorna true
            return ($numRegistros == 1) ? true : false;

PHP

Adenesjr

Melhor resposta

17/07/2014

Não acho que seja um bom modo realizar a busca e comparação do mode que está fazendo.
O mais interessante seria realizar uma busca no banco de dados apenas por login e comparar a senha retornada dentro do banco de dados com o md5 informado no PHP, mas nada impede de fazer do modo que está fazendo. O padrão md5 não é muito seguro para se gerar senhas, prefiro utilizar Blowfish[1].
Particularmente não sei como está sua estrutura de banco de dados, mas o que provavelmente pode estar ocorrendo é que o valor md5 retornado seja incompatível com a capacidade do campo, por exemplo, o código md5 gerado possui 40 caracteres e sua tabela é um varchar de 20.


[1]http://blog.thiagobelem.net/criptografando-senhas-no-php-usando-bcrypt-blowfish/

David Sylvestre

Responder Citar

Outras Respostas

17/07/2014

Ronaldo Lanhellas

Bom, se a pesquisa está retornando NULL é porque a senha é diferente da senha criptografada no banco, vamos pensar em algumas possibilidades:

1 - Antes de fazer o md5($senha) tente fazer um trim() na variável $senha, caso contrário espaços em branco podem ser criptografados levando a um MD5 diferente
2 - Cheque se a senha que está no banco está mesmo criptografada e também não tem nenhum espaço (novamente use o TRIM).


Caso nenhuma das dicas acima funcione, poste aqui um var_dump($senha) antes e depois de realizar o md5($senha). E poste também o conteúdo deste registro no banco de dados.
Responder Citar

17/07/2014

Adenesjr

Muito obrigado David, você está certo devo verificar a senha depois de buscar o registro.
Alterei a forma de encriptação para Blowfish[1], obrigado pela diga. Agora deu certo.

      $sql = "SELECT *
                  FROM usuarios
                 WHERE email = '$usuario'";

     $query = pg_query($sql);

     if (!($hash == $item['senha'])){
        $this->erro = "A senha informada é inválida";
        return false;
    } 
Responder Citar

18/07/2014

David Sylvestre

Fico feliz que tenha dado certo :D
Responder Citar

21/07/2014

William (devwilliam)

Finalizando tópico!
Responder Citar