Criptografia do método GET no PHP
Minha intenção neste artigo é mostrar que podemos suprir a deficiência de segurança no método GET. Muitas pessoas acabam usando o método POST por ser mais seguro e confiável que o método GET, mas às vezes, por exemplo, quando você pega um sistema pronto e precisa fazer uma manutenção, é melhor você continuar usando o método GET do que trocar tudo por POST.
Parte 3: Solução: MD5
Depois de muito tempo analisando, resolvi deixar tudo como está, ou seja, usando o método GET. Porém, descobri que podia deixar o GET mais seguro. Mas como? Usando criptografia MD5.
Mas o que seria criptografia MD5?
O MD5 (Message-Digest algorithm 5) é um algoritmo de hash de 128 bits unidirecional desenvolvido pela RSA Data Security, Inc., descrito na RFC 1321, usado por softwares com protocolo ponto-a-ponto (P2P), verificação de integridade e logins. Ou seja, uma forma de criptografia, extremamente segura.
Mas informações sobre essa criptografia, você pode encontrar neste link:
Vamos montar um exemplo em PHP:
Tenho as seguintes páginas:
Mas o que seria criptografia MD5?
O MD5 (Message-Digest algorithm 5) é um algoritmo de hash de 128 bits unidirecional desenvolvido pela RSA Data Security, Inc., descrito na RFC 1321, usado por softwares com protocolo ponto-a-ponto (P2P), verificação de integridade e logins. Ou seja, uma forma de criptografia, extremamente segura.
Mas informações sobre essa criptografia, você pode encontrar neste link:
Vamos montar um exemplo em PHP:
Tenho as seguintes páginas:
- index.php
- editar.php
<?
//Esta página esta passando os parâmetros criptografados pelo GET.
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("
Resumidamente, a principal parte do código são as funções get_rnd_iv() e md5_encrypt(), são essas duas funções responsáveis pela criptografia do ID que estou passando.
Note que não estou passando diretamente o ID que recebi do Banco de Dados. Primeiro criptografo ele para depois passar pela variável $id_cript, responsável por chamar a função md5_encrypt(). Veja também que existe um "password" que estou passando na função. Este password deve ser o mesmo tanto na hora de enviar os dados criptografados como na hora de receber os dados. Se este password estiver errado, os dados não serão decriptografados e a função não vai funcionar.
O usuário vai ver uma página assim:
http://seusite.com.br/bolao/editar.php?oi=JohiB/WP+I6LAJfphhfmzR8FmRcCE8vCAJpAPE6585Y=
Observe a criptografia MD5 funcionando:
oi=JohiB/WP+I6LAJfphhfmzR8FmRcCE8vCAJpAPE6585Y=
Conteúdo da pagina editar.php:
Esta página recebe os parâmetros criptografados passados pela página index.php e decripta os parâmetros.
A função responsável por fazer isso é a md5_decrypt(). Note que mesmo estando em páginas diferentes, existe um password também nesta página, o mesmo password (123) que existe na página index.php.
A função verifica se os dados pertencem ao mesmo password. Os dados sendo do mesmo password, a função decripta as informações. Veja também, que logo depois de decriptar os dados, estou usando o mesmo dado para fazer uma consulta em uma tabela do meu Banco de Dados e o melhor, totalmente transparente ao usuário.
", 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);
}
$con = new ConexaoMysql();
$result = $con->sql("SELECT * FROM clientes");
$dados = mysql_fetch_array($result);
$linhas = mysql_num_rows($result);
$ini = 0;
while ($linhas > $ini)
{
echo "<tr>";
$id = $dados['id'];
$password = "123";
$id_cript = md5_encrypt($id, $password);
echo "<td bgcolor='#EEEEEE'><b>Cliente</b></td>";
echo "<td width = '12%'><a href =editar.php?oi=$id_cript'>Editar</a></td>";
echo "</tr>";
$dados = mysql_fetch_array($result);
$ini++;
}
?>
//Esta página esta passando os parâmetros criptografados pelo GET.
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("
Depois de muito tempo analisando, resolvi deixar tudo como está, ou seja, usando o método GET. Porém, descobri que podia deixar o GET mais seguro. Mas como? Usando criptografia MD5.
Mas o que seria criptografia MD5?
O MD5 (Message-Digest algorithm 5) é um algoritmo de hash de 128 bits unidirecional desenvolvido pela RSA Data Security, Inc., descrito na RFC 1321, usado por softwares com protocolo ponto-a-ponto (P2P), verificação de integridade e logins. Ou seja, uma forma de criptografia, extremamente segura.
Mas informações sobre essa criptografia, você pode encontrar neste link:
Vamos montar um exemplo em PHP:
Tenho as seguintes páginas:
Mas o que seria criptografia MD5?
O MD5 (Message-Digest algorithm 5) é um algoritmo de hash de 128 bits unidirecional desenvolvido pela RSA Data Security, Inc., descrito na RFC 1321, usado por softwares com protocolo ponto-a-ponto (P2P), verificação de integridade e logins. Ou seja, uma forma de criptografia, extremamente segura.
Mas informações sobre essa criptografia, você pode encontrar neste link:
Vamos montar um exemplo em PHP:
Tenho as seguintes páginas:
- index.php
- editar.php
<?
//Esta página esta passando os parâmetros criptografados pelo GET.
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("
Resumidamente, a principal parte do código são as funções get_rnd_iv() e md5_encrypt(), são essas duas funções responsáveis pela criptografia do ID que estou passando.
Note que não estou passando diretamente o ID que recebi do Banco de Dados. Primeiro criptografo ele para depois passar pela variável $id_cript, responsável por chamar a função md5_encrypt(). Veja também que existe um "password" que estou passando na função. Este password deve ser o mesmo tanto na hora de enviar os dados criptografados como na hora de receber os dados. Se este password estiver errado, os dados não serão decriptografados e a função não vai funcionar.
O usuário vai ver uma página assim:
http://seusite.com.br/bolao/editar.php?oi=JohiB/WP+I6LAJfphhfmzR8FmRcCE8vCAJpAPE6585Y=
Observe a criptografia MD5 funcionando:
oi=JohiB/WP+I6LAJfphhfmzR8FmRcCE8vCAJpAPE6585Y=
Conteúdo da pagina editar.php:
Esta página recebe os parâmetros criptografados passados pela página index.php e decripta os parâmetros.
A função responsável por fazer isso é a md5_decrypt(). Note que mesmo estando em páginas diferentes, existe um password também nesta página, o mesmo password (123) que existe na página index.php.
A função verifica se os dados pertencem ao mesmo password. Os dados sendo do mesmo password, a função decripta as informações. Veja também, que logo depois de decriptar os dados, estou usando o mesmo dado para fazer uma consulta em uma tabela do meu Banco de Dados e o melhor, totalmente transparente ao usuário.
", 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);
}
$con = new ConexaoMysql();
$result = $con->sql("SELECT * FROM clientes");
$dados = mysql_fetch_array($result);
$linhas = mysql_num_rows($result);
$ini = 0;
while ($linhas > $ini)
{
echo "<tr>";
$id = $dados['id'];
$password = "123";
$id_cript = md5_encrypt($id, $password);
echo "<td bgcolor='#EEEEEE'><b>Cliente</b></td>";
echo "<td width = '12%'><a href =editar.php?oi=$id_cript'>Editar</a></td>";
echo "</tr>";
$dados = mysql_fetch_array($result);
$ini++;
}
?>
//Esta página esta passando os parâmetros criptografados pelo GET.
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("
Depois de muito tempo analisando, resolvi deixar tudo como está, ou seja, usando o método GET. Porém, descobri que podia deixar o GET mais seguro. Mas como? Usando criptografia MD5.
Mas o que seria criptografia MD5?
O MD5 (Message-Digest algorithm 5) é um algoritmo de hash de 128 bits unidirecional desenvolvido pela RSA Data Security, Inc., descrito na RFC 1321, usado por softwares com protocolo ponto-a-ponto (P2P), verificação de integridade e logins. Ou seja, uma forma de criptografia, extremamente segura.
Mas informações sobre essa criptografia, você pode encontrar neste link:
Vamos montar um exemplo em PHP:
Tenho as seguintes páginas:
Mas o que seria criptografia MD5?
O MD5 (Message-Digest algorithm 5) é um algoritmo de hash de 128 bits unidirecional desenvolvido pela RSA Data Security, Inc., descrito na RFC 1321, usado por softwares com protocolo ponto-a-ponto (P2P), verificação de integridade e logins. Ou seja, uma forma de criptografia, extremamente segura.
Mas informações sobre essa criptografia, você pode encontrar neste link:
Vamos montar um exemplo em PHP:
Tenho as seguintes páginas:
- index.php
- editar.php
<?
//Esta página esta passando os parâmetros criptografados pelo GET.
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("{TEXTO}", 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);
}
$con = new ConexaoMysql();
$result = $con->sql("SELECT * FROM clientes");
$dados = mysql_fetch_array($result);
$linhas = mysql_num_rows($result);
$ini = 0;
while ($linhas > $ini)
{
echo "<tr>";
$id = $dados['id'];
$password = "123";
$id_cript = md5_encrypt($id, $password);
echo "<td bgcolor='#EEEEEE'><b>Cliente</b></td>";
echo "<td width = '12%'><a href =editar.php?oi=$id_cript'>Editar</a></td>";
echo "</tr>";
$dados = mysql_fetch_array($result);
$ini++;
}
?>
//Esta página esta passando os parâmetros criptografados pelo GET.
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("{TEXTO}", 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);
}
$con = new ConexaoMysql();
$result = $con->sql("SELECT * FROM clientes");
$dados = mysql_fetch_array($result);
$linhas = mysql_num_rows($result);
$ini = 0;
while ($linhas > $ini)
{
echo "<tr>";
$id = $dados['id'];
$password = "123";
$id_cript = md5_encrypt($id, $password);
echo "<td bgcolor='#EEEEEE'><b>Cliente</b></td>";
echo "<td width = '12%'><a href =editar.php?oi=$id_cript'>Editar</a></td>";
echo "</tr>";
$dados = mysql_fetch_array($result);
$ini++;
}
?>
Resumidamente, a principal parte do código são as funções get_rnd_iv() e md5_encrypt(), são essas duas funções responsáveis pela criptografia do ID que estou passando.
Note que não estou passando diretamente o ID que recebi do Banco de Dados. Primeiro criptografo ele para depois passar pela variável $id_cript, responsável por chamar a função md5_encrypt(). Veja também que existe um "password" que estou passando na função. Este password deve ser o mesmo tanto na hora de enviar os dados criptografados como na hora de receber os dados. Se este password estiver errado, os dados não serão decriptografados e a função não vai funcionar.
O usuário vai ver uma página assim:
http://seusite.com.br/bolao/editar.php?oi=JohiB/WP+I6LAJfphhfmzR8FmRcCE8vCAJpAPE6585Y=
Observe a criptografia MD5 funcionando:
oi=JohiB/WP+I6LAJfphhfmzR8FmRcCE8vCAJpAPE6585Y=
Conteúdo da pagina editar.php:
<?
//Essa página recebe os parâmetros criptografados e tem a função de "decriptografar" os dados recebidos
$id_cript = $_GET['oi'];
$password = "123";
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);
}
$id = md5_decrypt($id_cript, $password);
$con = new ConexaoMysql();
$result = $con->sql("SELECT * FROM clientes WHERE id = '$id'");
$dados = mysql_fetch_array($result);
$nome = $dados['nome'];
?>
//Essa página recebe os parâmetros criptografados e tem a função de "decriptografar" os dados recebidos
$id_cript = $_GET['oi'];
$password = "123";
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);
}
$id = md5_decrypt($id_cript, $password);
$con = new ConexaoMysql();
$result = $con->sql("SELECT * FROM clientes WHERE id = '$id'");
$dados = mysql_fetch_array($result);
$nome = $dados['nome'];
?>
Esta página recebe os parâmetros criptografados passados pela página index.php e decripta os parâmetros.
A função responsável por fazer isso é a md5_decrypt(). Note que mesmo estando em páginas diferentes, existe um password também nesta página, o mesmo password (123) que existe na página index.php.
A função verifica se os dados pertencem ao mesmo password. Os dados sendo do mesmo password, a função decripta as informações. Veja também, que logo depois de decriptar os dados, estou usando o mesmo dado para fazer uma consulta em uma tabela do meu Banco de Dados e o melhor, totalmente transparente ao usuário.
$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);
}
$con = new ConexaoMysql();
$result = $con->sql("SELECT * FROM clientes");
$dados = mysql_fetch_array($result);
$linhas = mysql_num_rows($result);
$ini = 0;
while ($linhas > $ini)
{
echo "<tr>";
$id = $dados['id'];
$password = "123";
$id_cript = md5_encrypt($id, $password);
echo "<td bgcolor='#EEEEEE'><b>Cliente</b></td>";
echo "<td width = '12%'><a href =editar.php?oi=$id_cript'>Editar</a></td>";
echo "</tr>";
$dados = mysql_fetch_array($result);
$ini++;
}
?>
Resumidamente, a principal parte do código são as funções get_rnd_iv() e md5_encrypt(), são essas duas funções responsáveis pela criptografia do ID que estou passando.
Note que não estou passando diretamente o ID que recebi do Banco de Dados. Primeiro criptografo ele para depois passar pela variável $id_cript, responsável por chamar a função md5_encrypt(). Veja também que existe um "password" que estou passando na função. Este password deve ser o mesmo tanto na hora de enviar os dados criptografados como na hora de receber os dados. Se este password estiver errado, os dados não serão decriptografados e a função não vai funcionar.
O usuário vai ver uma página assim:
http://seusite.com.br/bolao/editar.php?oi=JohiB/WP+I6LAJfphhfmzR8FmRcCE8vCAJpAPE6585Y=
Observe a criptografia MD5 funcionando:
oi=JohiB/WP+I6LAJfphhfmzR8FmRcCE8vCAJpAPE6585Y=
Conteúdo da pagina editar.php:
<?
//Essa página recebe os parâmetros criptografados e tem a função de "decriptografar" os dados recebidos
$id_cript = $_GET['oi'];
$password = "123";
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);
}
$id = md5_decrypt($id_cript, $password);
$con = new ConexaoMysql();
$result = $con->sql("SELECT * FROM clientes WHERE id = '$id'");
$dados = mysql_fetch_array($result);
$nome = $dados['nome'];
?>
//Essa página recebe os parâmetros criptografados e tem a função de "decriptografar" os dados recebidos
$id_cript = $_GET['oi'];
$password = "123";
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);
}
$id = md5_decrypt($id_cript, $password);
$con = new ConexaoMysql();
$result = $con->sql("SELECT * FROM clientes WHERE id = '$id'");
$dados = mysql_fetch_array($result);
$nome = $dados['nome'];
?>
Esta página recebe os parâmetros criptografados passados pela página index.php e decripta os parâmetros.
A função responsável por fazer isso é a md5_decrypt(). Note que mesmo estando em páginas diferentes, existe um password também nesta página, o mesmo password (123) que existe na página index.php.
A função verifica se os dados pertencem ao mesmo password. Os dados sendo do mesmo password, a função decripta as informações. Veja também, que logo depois de decriptar os dados, estou usando o mesmo dado para fazer uma consulta em uma tabela do meu Banco de Dados e o melhor, totalmente transparente ao usuário.
$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);
}
$con = new ConexaoMysql();
$result = $con->sql("SELECT * FROM clientes");
$dados = mysql_fetch_array($result);
$linhas = mysql_num_rows($result);
$ini = 0;
while ($linhas > $ini)
{
echo "<tr>";
$id = $dados['id'];
$password = "123";
$id_cript = md5_encrypt($id, $password);
echo "<td bgcolor='#EEEEEE'><b>Cliente</b></td>";
echo "<td width = '12%'><a href =editar.php?oi=$id_cript'>Editar</a></td>";
echo "</tr>";
$dados = mysql_fetch_array($result);
$ini++;
}
?>
Resumidamente, a principal parte do código são as funções get_rnd_iv() e md5_encrypt(), são essas duas funções responsáveis pela criptografia do ID que estou passando.
Note que não estou passando diretamente o ID que recebi do Banco de Dados. Primeiro criptografo ele para depois passar pela variável $id_cript, responsável por chamar a função md5_encrypt(). Veja também que existe um "password" que estou passando na função. Este password deve ser o mesmo tanto na hora de enviar os dados criptografados como na hora de receber os dados. Se este password estiver errado, os dados não serão decriptografados e a função não vai funcionar.
O usuário vai ver uma página assim:
http://seusite.com.br/bolao/editar.php?oi=JohiB/WP+I6LAJfphhfmzR8FmRcCE8vCAJpAPE6585Y=
Observe a criptografia MD5 funcionando:
oi=JohiB/WP+I6LAJfphhfmzR8FmRcCE8vCAJpAPE6585Y=
Conteúdo da pagina editar.php:
<?
//Essa página recebe os parâmetros criptografados e tem a função de "decriptografar" os dados recebidos
$id_cript = $_GET['oi'];
$password = "123";
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);
}
$id = md5_decrypt($id_cript, $password);
$con = new ConexaoMysql();
$result = $con->sql("SELECT * FROM clientes WHERE id = '$id'");
$dados = mysql_fetch_array($result);
$nome = $dados['nome'];
?>
//Essa página recebe os parâmetros criptografados e tem a função de "decriptografar" os dados recebidos
$id_cript = $_GET['oi'];
$password = "123";
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);
}
$id = md5_decrypt($id_cript, $password);
$con = new ConexaoMysql();
$result = $con->sql("SELECT * FROM clientes WHERE id = '$id'");
$dados = mysql_fetch_array($result);
$nome = $dados['nome'];
?>
Esta página recebe os parâmetros criptografados passados pela página index.php e decripta os parâmetros.
A função responsável por fazer isso é a md5_decrypt(). Note que mesmo estando em páginas diferentes, existe um password também nesta página, o mesmo password (123) que existe na página index.php.
A função verifica se os dados pertencem ao mesmo password. Os dados sendo do mesmo password, a função decripta as informações. Veja também, que logo depois de decriptar os dados, estou usando o mesmo dado para fazer uma consulta em uma tabela do meu Banco de Dados e o melhor, totalmente transparente ao usuário.
Legal o seu artigo =]
Mas gostaria de fazer um breve comentário. Fiquei analisando o código de encriptação por bastante tempo pra tentar entender com detalhes o que ele estava fazendo, mas então notei que seria injusto dizer que a solução é o md5. Na verdade o md5 é um "ator" do elenco de encriptação que desempenha um bom papel.
A lógica da criação dos packers/unpackers (base 16/hexadecimal) utilizando uma semente aletória em cima de uma base hexadecimal foi uma ótima sacada - Pois mata dois coelhos com uma cajadada só:
- O md5 empacota e desempacota o texto com o auxilio da funcao mt_rand(), que não utiliza a libc que por sua vez geralmente retorna sementes meio viciadas.
- O metodo de empacotamento/desempacotamento faz a colisão tender a zero.
Se você for o autor desse algoritmo, parabéns
[]'s