Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

sublyer

MD5 Descriptografar

Recommended Posts

Bom tem uma função no PHP que transforma strings em MD5, mas como eu faço pra ele me retornar o valor antigo da string?Por exemplo:$string='Teste';$string_convertida=md5($string);$md5_normal=?Quem puder me ajudar eu agradeco desde ja ..

Compartilhar este post


Link para o post
Compartilhar em outros sites

O MD5 é uma criptografia que não tem volta.

 

Para verificar strings com MD5 você dar novamente um MD5 na string que você quer verificar.

 

Esta função é muito utilizada em Senhas no banco de dados.

 

Por exemplo:

 

Quando for cadastrar um novo usuário no banco você pega a senha que ele passou e aplica o MD5 nela:

$senha = $_POST['senha'];

$senha = md5($senha);

 

Depois, no momento em que o usário for fazer o login você deve pegar a senha que ele passou, aplicar o MD5 nela, e aí sim comparar com a existente no banco.

 

Entendeu??? http://forum.imasters.com.br/public/style_emoticons/default/joia.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

----------------->Não tem volta a função MD5...Mas é curioso nao ter volta, por exemplo, uma string x = "Thomas"; se eu fizer md5(x); sempre ela retorna o mesmo valor :D Acho que entenderam o que eu quis dizer...Mas tambem se tivesse volta nao ia ter sentido usar pra chavear senhase se for pra comparar, é só fazer a comparação dos md5's... :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Teria outro tipo de função de criptografia que desse pra encriptar e decriptar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Realmente interessante.Se volta sempre o mesmo valor, é engraçado não poder chegar ao valor original.Eu já vi o uso do MD5 para esse tipo de comparação de senhas. Mas realmente que tipo de aumento na segurança isso proporciona?Grato,

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, tenho quase certeza que tem como voltar... E tenho quase certeza também que não é nada seguro!Seria seguro só pra algum usuário final que conseguisse ver o banco de dados e visse aqueles 32 valores e não entendesse nada... Mas se ele souber que existe o MD5 ele pode simplismente voltar o valor...Isso tudo é suposição minha... Gostaria de mais esclarecimentos de qual a vantagem de se usar MD5 e qual seria uma alternativa mais segura...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas é curioso nao ter volta, por exemplo, uma string x = "Thomas"; se eu fizer md5(x);

 

Faz assim agora:

$x = "Thomas";
$y = "Thomaz";

echo md5($x);
echo "<br>";
echo md5($y);

Cara, tenho quase certeza que tem como voltar... E tenho quase certeza também que não é nada seguro!

 

Seria seguro só pra algum usuário final que conseguisse ver o banco de dados e visse aqueles 32 valores e não entendesse nada... Mas se ele souber que existe o MD5 ele pode simplismente voltar o valor...

 

 

Isso tudo é suposição minha... Gostaria de mais esclarecimentos de qual a vantagem de se usar MD5 e qual seria uma alternativa mais segura...

 

Se quiser entender melhor e falar com um pouco mais de enbasamento sobre o assunto, pode ler isto aqui.

http://www.faqs.org/rfcs/rfc1321

 

Aproveitando...

Leia aqui: http://en.wikipedia.org/wiki/Md5

E aqui: http://pt.wikipedia.org/wiki/MD5

Compartilhar este post


Link para o post
Compartilhar em outros sites

Consegui criptografar e descriptografar.

 

Essas são as funções

 

function get_rnd_iv($iv_len){   $iv = '';   while ($iv_len-- > 0) {	   $iv .= chr(mt_rand() & 0xff);   }   return $iv;}function md5_encrypt($plain_text, $password, $iv_len = 16){   $plain_text .= "\x13";   $n = strlen($plain_text);   if ($n % 16) $plain_text .= str_repeat("\0", 16 - ($n % 16));   $i = 0;   $enc_text = get_rnd_iv($iv_len);   $iv = substr($password ^ $enc_text, 0, 512);   while ($i < $n) {	   $block = substr($plain_text, $i, 16) ^ pack('H*', md5($iv));	   $enc_text .= $block;	   $iv = substr($block . $iv, 0, 512) ^ $password;	   $i += 16;   }   return base64_encode($enc_text);}function md5_decrypt($enc_text, $password, $iv_len = 16){   $enc_text = base64_decode($enc_text);   $n = strlen($enc_text);   $i = $iv_len;   $plain_text = '';   $iv = substr($password ^ substr($enc_text, 0, $iv_len), 0, 512);   while ($i < $n) {	   $block = substr($enc_text, $i, 16);	   $plain_text .= $block ^ pack('H*', md5($iv));	   $iv = substr($block . $iv, 0, 512) ^ $password;	   $i += 16;   }   return preg_replace('/\\x13\\x00*$/', '', $plain_text);}/******************************************/$plain_text = 'teste';$enc_text = md5_encrypt($plain_text, $password);echo "Texto Criptografado: [${enc_text}]<br />\n";$plain_text2 = md5_decrypt($enc_text, $password);echo "Texto Descriptografado: [${plain_text2}]<br />\n";

Compartilhar este post


Link para o post
Compartilhar em outros sites
Consegui criptografar e descriptografar.

 

Na realidade, isso não é md5... deram o nome de "md5_encrypt/decrypt" pra essas funções, mas o algorítimo delas nem de perto se assemelha ao do verdadeiro md5. Pode comparar os resultados:

$str = "senha";
echo md5($senha) . "<br />" . md5_encrypt($senha);

 

Demaso, se o cara invadir o banco de dados e pegar os 32 caracteres que correspondem à senha, ele só vai conseguir "descriptografar" por força bruta*. Isto se a senha do usuário for fraca (ou seja, se tiver poucos caracteres e se forem exclusivamente alfanuméricos) e se a pessoa que desenvolveu o sistema não pensou em nada no caso dos usuários utilizarem senhas fracas. Se não, mesmo que o cara pegue o hash md5, ele vai ficar eternamente tentando decodificar por força bruta.

 

Por exemplo, quem garante que os 32 caracteres são de um hash md5? Podem ser os 32 primeiros (ou últimos) caracteres de um hash sha1, que tem 40 caracteres quando é gerado. Ou ainda, podem ser o hash md5 de um sha1. Assim:

$hash = md5(sha1("senha"));

 

São muitas as possibilidades que você tem pra aumentar a segurança, mesmo que seu banco de dados seja invadido...

 

[]'s!

 

 

* Decodificação por força bruta é aquela em que se vai testando todas as combinações possíveis até se achar uma que bata com o valor original. Mesmo com os computadores mais avançados, poderia levar anos até conseguir decodificar um hash por força bruta.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sei que antigo este tópico, mas esse mesmo código esta no livro Segurança em PHP e esta aprovado, ate hoje nunca me deu problema.

 

Consegui criptografar e descriptografar.

 

Essas são as funções

 

function get_rnd_iv($iv_len)
{
   $iv = '';
   while ($iv_len-- > 0) {
	   $iv .= chr(mt_rand() & 0xff);
   }
   return $iv;
}

function md5_encrypt($plain_text, $password, $iv_len = 16)
{
   $plain_text .= "\x13";
   $n = strlen($plain_text);
   if ($n % 16) $plain_text .= str_repeat("\0", 16 - ($n % 16));
   $i = 0;
   $enc_text = get_rnd_iv($iv_len);
   $iv = substr($password ^ $enc_text, 0, 512);
   while ($i < $n) {
	   $block = substr($plain_text, $i, 16) ^ pack('H*', md5($iv));
	   $enc_text .= $block;
	   $iv = substr($block . $iv, 0, 512) ^ $password;
	   $i += 16;
   }
   return base64_encode($enc_text);
}

function md5_decrypt($enc_text, $password, $iv_len = 16)
{
   $enc_text = base64_decode($enc_text);
   $n = strlen($enc_text);
   $i = $iv_len;
   $plain_text = '';
   $iv = substr($password ^ substr($enc_text, 0, $iv_len), 0, 512);
   while ($i < $n) {
	   $block = substr($enc_text, $i, 16);
	   $plain_text .= $block ^ pack('H*', md5($iv));
	   $iv = substr($block . $iv, 0, 512) ^ $password;
	   $i += 16;
   }
   return preg_replace('/\\x13\\x00*$/', '', $plain_text);
}

/******************************************/
$plain_text = 'teste';

$enc_text = md5_encrypt($plain_text, $password);
echo "Texto Criptografado: [${enc_text}]<br />\n";

$plain_text2 = md5_decrypt($enc_text, $password);
echo "Texto Descriptografado: [${plain_text2}]<br />\n";

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.