Criptografia em PHP: criptografia e hash (guia prático)

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Criptografia em PHP: criptografia e hash de dados



No desenvolvimento web moderno, a segurança dos dados não é uma opção, mas um requisito obrigatório. O PHP fornece um poderoso arsenal de ferramentas para proteção criptográfica, dividido em duas áreas principais: criptografia (transformação reversível de dados) e hash (transformação irreversível). Neste artigo, abordaremos as principais bibliotecas e funções do PHP para ambas as tarefas com exemplos práticos.



1. Conceitos básicos de criptografia em PHP



Antes de ir para o código, é importante distinguir dois tipos de operações:

  • Criptografia — transformação de dados com possibilidade de recuperação do texto original mediante uma chave. Usada para transmitir informações confidenciais.
  • Hash — transformação unidirecional, onde é impossível recuperar os dados originais. Aplicada para armazenar senhas e verificar integridade.


O PHP utiliza as extensões openssl (para criptografia) e password_hash/hash (para hash).



2. Criptografia de dados em PHP



2.1. Criptografia simétrica (AES)



O algoritmo mais popular é o AES-256-GCM, que oferece alto desempenho e autenticação integrada.



<?php// Criptografia$data = "Mensagem secreta";$key = openssl_random_pseudo_bytes(32); // Chave de 256 bits$iv = openssl_random_pseudo_bytes(12);  // Vetor de 96 bits para GCM

$encrypted = openssl_encrypt( $data, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag);

// Codificação em base64 para transmissão$encrypted_base64 = base64_encode($iv . $tag . $encrypted);

// Descriptografia$decoded = base64_decode($encrypted_base64);$iv = substr($decoded, 0, 12);$tag = substr($decoded, 12, 16);$ciphertext = substr($decoded, 28);

$decrypted = openssl_decrypt( $ciphertext, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag);

echo "Descriptografado: " . $decrypted; // Mensagem secreta?>


Importante: Nunca use o modo ECB — ele não é seguro. Sempre use GCM ou CBC com HMAC.



2.2. Criptografia assimétrica (RSA)



Para troca de chaves e assinaturas digitais, utiliza-se RSA. O PHP usa um par de chaves (pública/privada).



<?php// Geração de chaves$config = [    "private_key_bits" => 2048,    "private_key_type" => OPENSSL_KEYTYPE_RSA,];$res = openssl_pkey_new($config);openssl_pkey_export($res, $privateKey);$publicKey = openssl_pkey_get_details($res)['key'];

// Criptografia com chave pública$data = "Dados confidenciais";openssl_public_encrypt($data, $encrypted, $publicKey);

// Descriptografia com chave privadaopenssl_private_decrypt($encrypted, $decrypted, $privateKey);

echo $decrypted; // Dados confidenciais?>


3. Hash de senhas



O hash de senhas é uma tarefa criticamente importante. O PHP fornece funções especializadas que selecionam automaticamente o salt e o custo computacional.



3.1. bcrypt (recomendado por padrão)



A função password_hash() com o algoritmo PASSWORD_BCRYPT cria um hash seguro com salt automático.



<?php$password = "UserPassword123!";

// Hash$hash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);echo "Hash: " . $hash . ""; // $2y$12$...

// Verificaçãoif (password_verify($password, $hash)) { echo "Senha correta!";} else { echo "Senha incorreta";}

// Verificação de necessidade de rehashif (password_needs_rehash($hash, PASSWORD_BCRYPT, ['cost' => 12])) { $newHash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);}?>


3.2. Argon2 (padrão moderno)



A partir do PHP 7.2

Recommendations