Criptografia em PHP: criptografia e hash — guia completo

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 — 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)

Recommendations