Criptografia no PHP usando md5, sha1 e base64

Veja um artigo mais atualizado em: Criptografando senhas no PHP usando bcrypt (Blowfish)


Hoje vou falar sobre três tipos de codificação/criptografia (na verdade, hash) muito usados no PHP.

Dois deles são hashes de “mão unica” ou one-way. Com esse tipo de hash você apenas codifica o texto.. Não tem como, baseado no texto já codificado, descobrir o texto original. O outro é mão dupla, o que possibilita a criação de duas funções: uma para codificar e outra para decodificar o texto.

MD5

A primeira que vou falar é sem dúvida a mais comum, chama md5 que é um algoritmo de um hash de 128 bits. Não vou tentar explicar o que é hash nem algoritmo agora… Só vou explicar como você pode usar o md5 na sua aplicação.

O md5 gera uma string alfa-numérica de 32 caracteres, não importa se você tá gerando o md5 de duas letras ou de um texto de 20 parágrafos… O md5 gerado sempre vai ter 32 caracteres.

Você pode usar o md5 na hora de salvar um dado sigiloso (senhas) o banco… Com isso, ninguém tem acesso à senha original do cliente. Depois é só comparar o md5 do que foi digitado no campo senha (na hora do login) com o que está armazenado no banco, se bater, tá tudo certo.

Infelizmente o md5 tem um “problema”… Você pode, com muita dificuldade (preste atenção: muita dificuldade), gerar dois md5 iguais. Duas strings diferentes que acabem como um mesmo md5. Isso é raríssimo, mas pode acontecer.

Pra usar o md5 no PHP é só usar da seguinte forma:

$string = 'O rato reu a ropa do rei de Roma';
$codificada = md5($string);
echo "Resultado da codificação usando md5: " . $codificada;
// 54cf74d1acdb4037ab956c269b63c8ac

SHA1

A outra hash de mão única é o sha1. Ele é praticamente identico ao md5, só que tem 160 bits, o que acaba criando uma string-resultado maior: 40 caracteres alfa-numéricos. Outro ponto do sha1 é que, por ser 160 bits e gerar uma cadeia de caracteres maior, uma colisão (encontrar duas strings que, codificadas, sejam a mesma coisa) é bem mais rara que numa chave de 128bits.

Usar o sha1 no PHP é exatamente a mesma coisa que o md5, só que mudando o nome da função:

$string = 'O rato reu a ropa do rei de Roma';
$codificada = sha1($string);
echo "Resultado da codificação usando sha1: " . $codificada;
// b186b709f7cf5a1d98d413379a66e511df8d59a4

BASE64

É um método para codificação dos dados para transferência na Internet. Ela é uma codificação de mão dupla, e usando uma segunda função você pode descobrir a string original de uma string codificada.

Para usar ela no PHP você tem as duas formas:

$string = 'O rato reu a ropa do rei de Roma';

$codificada = base64_encode($string);

echo "Resultado da codificação usando base64: " . $codificada;
// TyByYXRvIHJldSBhIHJvcGEgZG8gcmVpIGRlIFJvbWE=

echo "

";

$original = base64_decode($codificada);

echo "Resultado da decodificação usando base64: " . $original;
// O rato reu a ropa do rei de Roma

// Note que $original vai ser idêntica a $string

Viram como é simples? Com esses recursos é possível deixar a aplicação bem mais segura e, por que não, organizada.

No próximo post explicarei como criar as suas próprias funções no PHP. Até lá!

Documentação Oficial:

  • Função md5() » Hash de mão única
  • Função sha1() » Hash de mão única
  • Função base64_encode() » Função para codificar strings usando base64
  • Função base64_decode() » Função para decodificar strings usando base64

35 ideias sobre “Criptografia no PHP usando md5, sha1 e base64

  1. Mauricio de Oliveira

    Olá Thiago, primeiramente gostaria de agradece-lo por manter este blog que nos ajuda muito, aprendi muita coisa em php com este blog. Obrigado.

    Mas agora estou com uma dúvida, se puder me ajudar ótimo, se não ótimo também XD. É o seguinte, no meu sistema quando cadastro um usuário e senha, a senha é criptografada em sha1, só que em uma das paginas do sistema intitulada de “Meu perfil” eu tenho um campo que deveria mostrar a senha do usuário, só que para mim ela vem criptografada, qual a solução para mostrar a real senha, ou seja, para descriptografar esta senha.

    Mais uma vez obrigado por tudo.

  2. Everton

    Bom dia, amigo!
    Trabalho com codigniter, que é um framework em php, pensei em usar o base64 para codificar uma variavel da url, mas não deu, parece que o sistema não reconhece a Url. tem alguma dica?

  3. Pingback: Criptografia no PHP usando md5, sha1 e base64 | blog tutsmais Criptografia no PHP usando md5, sha1 e base64 | + tutoriais e dicas

  4. Filipe Azevedo

    Olá Thiago, gostaria de agradecer a você esse artigo que me fez compreender melhor como funciona afinal o md5, sha1 e base64_encode e decode.

    São artigos assim que contribuem para o enriquecimento dos conhecimentos de uma pessoa, o meu bem haja.

    :)

  5. Rafael Capretz

    Thiago, achei mtoo interessante seu artigo.. eu li aqui e fiquei com uma dúvida. É o seguinte, posso usar mais de um tipo de criptografia? por exemplo:

    $codificada = sha1($string);
    $codificada2 = md5($codificada);

    ou usar de novo a codifica, por exemplo:

    $codificada = sha1($string);
    $codificada2 = sha1($codificada);

    seria ambiguo fazer isso? só perda de tempo?
    e esse post eu vi que foi escrito em 11 de março de 2009. Hoje em dia já temos algo mais seguro? algum novo tipo de criptografia?

    Obrigado, Abraços

  6. Sandro MArcelo

    Thiago adorei teu blgo muito bom mesmo, tenho uma duvida, preciso mascarar ou melhor criptografar algumas parte de um site que vai ser hoepedado em um servidor de cliente com um sistema que desenvolvemos aqui(lembrando não sou programador, apenas idealizador do projeto) e não gostaria que a pessoa do outro lado pega se meu trabalho e repassa se a outros, sei que vc me entende, tiria como fazer isso de alguma forma.
    Brigadaum!!

  7. Jefrey

    É IMPOSSÍVEL CRIPTOGRAFAR ALGO EM PHP.
    Um site (que eu não vou falar aqui, é claro! Se o Thiago quiser saber o nome dele, me mande um e-mail) consegue em menos de um segundo descriptografar MD5 e Sha1.
    E o Base64 possui seu próprio descriptografador.

    1. Thiago Belem

      Não sejamos precipitados… É possível sim criptografar algo em PHP.

      O base64 não é uma criptografia e, como eu disse no artigo, é de mão dupla e
      pode ser descriptografado fácilmente.

      Já o *MD5* e o *SHA1* criam strings criptografadas. Esse tipo de site que
      você disse, tem um banco de dados enorme com os MD5/SHA1 e suas respectivas
      “strings de origem”, mas ele não está descriptografando o MD5/SHA1… Está
      apenas encontrando a string original baseada num banco de dados.

      Você pode ler mais sobre o SHA1 aqui: http://en.wikipedia.org/wiki/Sha1

  8. Pedro Vidal

    Olá Thiago, muito bom o seu blog, acompanho diariamente…
    Fiquei com uma dúvida: Qual a probabilidade de se gerar dois md5 iguais?
    Grande abraço!

  9. hugo leonardo

    nossa, tenho que dizer que estou viciado no seu blog. estou lendo post atrás de post e estou “pagando pau” mesmo. haha

    agora, como todo comentário que eu procuro fazer, vou acompanhá-lo de uma dúvida:

    não seria ridiculamente inseguro o base64_encode se ele não usa uma chave de encriptação? pois digamamos que alguém intercepte os dados, basta passar o decode e pronto, terá acesso às informações. já com uma chave de encriptação, seria como uma senha para decodificar os dados. o base64_encode possui tal funcionalidade?

    1. hugo leonardo

      essa função crypt é unidirecional também…
      o que eu queria aprender mesmo é uma bidirecional que use um salt para decodificação. conhece alguma?

    2. hugo leonardo

      anula esse último comentário meu ae. dando uma melhor olhada na página parece que ela resolve sim (:

  10. Katharine Azevedo

    Oi Thiago,

    Bom, conheci seu blog esta semana e estou adorando…Muuuuuuuuuito bons seus tutoriais continue assim….

    A minha pergunta é se você saberia me dizer como eu faço para fazer transações Secure Sockets Layer – SSL, ou seja, para garantir a transação segura na web.

    Desde já agradeço.

    Att.

    Katharine

  11. Rogerio J. Gentil

    Estou acompanhando seus posts para desenvolver um sistema e esse tutorial ficou muito bom. Eu só conhecia o sistema de criptografia md5. Agora implementei o sha1.
    ABs

  12. aldeilson carmo dos santos

    mestre você tem como me enviar esse escript da forma que ele pessa o texto pra codificar e pessa o texto pra decodificar seria muito grato se você pudec me e ajudar nisso. Agradeço desde já

    1. Thiago Belem

      @Adeilson
      Dá uma olhada no artigo que, nele mesmo, existem exemplos de uso… É só adaptar à sua necessidade. Já te dei a vara, a isca e o local pra pescar, vc ainda quer que eu pesque pra você? :P

  13. Sergio Araujo

    Parabens pelo post, mas como fazer esse MD5 funcionar ?

    Qual software instalar no windows xp ou vista ou linux para ter acesso aesse tipo de informação,por exenplo;

    Encryitar Senhas
    Desencrypitar Senhas no PHP ?

    Abraços

    1. Thiago Belem

      @Sergio
      Fala Sergio… Tudo bem?

      Bom… O MD5 é um algoritmo de encriptação genérico, existe pronto em quase todas as liguagems de programação… Se você está rodando um servidor de web com PHP no seu computador já vai poder usar o MD5() sem problema nenhum pois ele já faz parte do código fonte original do PHP… Era essa a sua dúvida?

  14. Wanderly

    Meus parabéns Thiago Belém, esse artigo é muito útil e mostra com muita praticidade a utilização dessas funções, uma ótima solução também para passar dados via url, principalmento o base64 encode() muito sucinto e simples a utilização.

    Abraço.

  15. André

    Começei a usar codificação em senhas a uns dias atras.
    Esse texto reforçou meu conhecimento de codificação.
    Muito bom!

    “No próximo post explicarei como criar as suas próprias funções no PHP. Até lá!”

    Eu pensei nisso no colégio hoje hehe, aguardando por este post!

Os comentários estão fechados.