Criptografia em PHP: criptografia e hash — guia completo
No desenvolvimento web moderno, a segurança dos dados é uma das principais prioridades. O PHP fornece ferramentas internas poderosas para proteção criptográfica: desde hash simples de senhas até criptografia assimétrica complexa. Neste artigo, abordaremos as principais abordagens, bibliotecas e melhores práticas para trabalhar com criptografia em PHP.
1. Hash de dados
Hash é a transformação irreversível de dados em uma string de comprimento fixo. É usado para armazenar senhas, verificar a integridade de arquivos e criar assinaturas digitais.
1.1. Hash de senhas (password_hash)
A partir do PHP 5.5, para hash de senhas, recomenda-se usar a função password_hash(). Ela seleciona automaticamente um algoritmo seguro (por padrão, bcrypt) e gera um salt.
<?php// Hash de senha$password = 'MySecurePassword123!';$hash = password_hash($password, PASSWORD_DEFAULT);
echo "Hash: " . $hash . "";
// Verificação de senhaif (password_verify($password, $hash)) { echo "Senha correta!";} else { echo "Senha incorreta!";}?>1.2. Hash com hash()
Para outros fins (por exemplo, checksums de arquivos), use a função hash() com algoritmos SHA-256, SHA-512 ou BLAKE2.
<?php$data = "Dados secretos";$sha256_hash = hash('sha256', $data);$blake2b_hash = hash('blake2b', $data);
echo "SHA-256: " . $sha256_hash . "";echo "BLAKE2b: " . $blake2b_hash . "";?>2. Criptografia simétrica
A criptografia simétrica usa a mesma chave para criptografar e descriptografar dados. Em PHP, a extensão OpenSSL é usada para isso.
2.1. Criptografia com AES-256-GCM (criptografia autenticada)
O modo recomendado é AES-256-GCM, que fornece confidencialidade e verificação de integridade.
<?php$plaintext = "Mensagem confidencial";$key = random_bytes(32); // Chave de 256 bits$iv = random_bytes(12); // Vetor de inicialização de 96 bits
// Criptografia$ciphertext = openssl_encrypt( $plaintext, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag);
echo "Dados criptografados (base64): " . base64_encode($ciphertext) . "";echo "Tag de autenticação: " . bin2hex($tag) . "";
// Descriptografia$decrypted = openssl_decrypt( $ciphertext, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag);
echo "Descriptografado: " . $decrypted . "";?>2.2. Criptografia com AES-256-CBC (para compatibilidade)
Se for necessária compatibilidade com sistemas antigos, use AES-256-CBC com HMAC para verificação de integridade.
<?phpfunction encryptAesCbc($plaintext, $key) { $iv = random_bytes(16); $ciphertext = openssl_encrypt($plaintext, 'aes-256-cbc', $key, OPENSSL_RAW_DATA, $iv); $hmac = hash_hmac('sha256', $iv . $ciphertext, $key, true); return base64_encode($hmac . $iv . $ciphertext);}
function decryptAesCbc($data, $key) { $data = base64_decode($data); $hmac = substr($data, 0, 32); $iv = substr($data, 32, 16); $ciphertext = substr($data, 48); $expectedHmac = hash_hmac('sha256', $iv . $ciphertext, $key, true); if (!hash_equals($hmac, $expectedHmac)) { throw new Exception("Integridade dos dados violada!"); } return openssl_decrypt($ciphertext, 'aes-256-cbc', $key, OPENSSL_RAW_DATA, $iv);}
$key = random_bytes(32);$encrypted = encryptAesCbc("Dados secretos", $key);echo "Criptografado: " . $encrypted . "";echo "Descriptografado: " . decryptAesCbc($encrypted, $key) . "";?>3. Criptografia assimétrica
A criptografia assimétrica usa um par de chaves: pública (para criptografia)
Também na biblioteca
Métricas Prometheus em TypeScript: guia completo para client.js
ORM para Rust: comparação e exemplos Diesel, SeaORM, SQLx
iTextSharp para C# (.NET): guia completo com exemplos
gRPC para Go (Golang): bibliotecas, exemplos e guia prático