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
Também na biblioteca
Criptografia em Java: criptografia e hash de dados
Envio de email em JavaScript (Node.js): Nodemailer, SendGrid, Mailgun
Trabalhando com Excel em JavaScript (Node.js): bibliotecas e exemplos de código