Raphox's Site

Armazenando e recuperando dados criptografados em Banco

O que será feito

Este artigo vai lhe mostrar como armazenar e recuperar informações de seu banco através de criptografia. Com isso você terá uma maior segurança e privacidade das informações dos usuário de seu sistema. Veja mais sobre criptografia em criptografia.

  • Necessária extensão mcrypt
  • No PHP 5.0.0 você vai precisar do libmcrypt Version 2.5.6 ou posterior

Funções

  • mcrypt_get_iv_size() - Retorna o tamanho do Vetor de inicialização em bytes
  • mcrypt_create_iv() - Cria um vetor de inicialização (IV) baseado em um código randômico
  • mcrypt_encrypt() - Criptografa uma string
  • mcrypt_decrypt() - Descriptografa uma string
  • rtrim() - Retira espaço em branco (ou outros caracteres) do final da string
  • strlen() - Retorna o tamanho de uma string
  • pack() - Empacota dados de argumentos em cadeia binária de acordo com o formato fornecido.

Códigos

Geração do IV

Um vetor de inicialização não é obrigatório para criptografar uma string. Mas caso não seja fornecida para a função responsável o PHP retornará um 'warning'. É possivel você gerar um aleatóriamente através de:

$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB); $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); MCRYPT_MODE_ECB => É um dos modos do agorítmo da extenção Mcrypt, onde se encontar também: "cbc", "cfb", "ofb", "nofb" ou "stream".

Mas você também pode definir um qualquer, contendo um tamanho máximo definido pelo seu algorítimo de criptografia selecionado. No nosso caso o MCRYPT_RIJNDAEL_128 que seu tamanho máximo é de 16 caracteres ou 128bits.

Criptografar string

Através do código abaixo você gerará uma string binária contendo sua string criptografada.

$string = 'hellow word'; $chave = 'minha chave secreta' $string_ecrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $chave, $string, MCRYPT_MODE_ECB, 'meu_iv');

Armazenar string criptografada em banco

Se você verificar, vai perceber que a string gerada pela função mcrypt_encrypt() estará em formato binário, e se você enviar direto para seu banco de dados algo não dará muito certo. Uma das opões para armazenar sua string no banco é convertendo para hexadecimal através da código:

$string_hexa = bin2hex($string_ecrypted);

Com isso é só usar seu ORM ou se você ainda esta nos primórdios utilize seu mysql_query().

Descriptografar sua informação armazenada

Depois de consultar o dado no banco, você tera uma $string_ecrypted. Com isso vamos fazer o seguinte:

$len = strlen($string_ecrypted); $hex = pack("H" . $len, $string_ecrypted); rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $chave, $hex, MCRYPT_MODE_ECB, MCRYPT_IV), "\0");

E "voilà", temos novamente nossa informação em seu formato real. Agora você pode me perguntar o porquê do uso do rtrim(). Na verdade eu não sei bem, só sei que as vezes a função mcrypt_decrypt() retorna uns caracteres que não deveria. Então é interessante removê-los.

Outra coisa interessante é saber que existem vários outros algorítimos de criptografia disponíveis e você pode encontrá-los em Mcrypt ciphers

Atividade recente no site