Criptografia em PHP: criptografia e hashing de dados
A segurança de aplicações web é uma das principais tarefas do desenvolvedor. O PHP oferece ferramentas integradas poderosas para proteção criptográfica de dados. Neste artigo, abordaremos duas direções principais: criptografia (transformação de dados com possibilidade de recuperação reversa) e hashing (transformação unidirecional para verificação de integridade).
1. Hashing em PHP
O hashing é usado para armazenar senhas, somas de verificação e verificar a integridade dos dados. Em PHP, as funções password_hash() e hash() são usadas para esses fins.
1.1. Hashing seguro de senhas
Nunca use md5 ou sha1 para armazenar senhas. Use o algoritmo bcrypt através de password_hash():
<?php// Hashing de senha$password = 'MySecureP@ss123';$hash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);
echo $hash; // $2y$12$...
// Verificação de senhaif (password_verify('MySecureP@ss123', $hash)) { echo "Senha correta!";} else { echo "Senha incorreta!";}?>A função password_hash() gera automaticamente um salt e usa um algoritmo seguro. O parâmetro cost ajusta a complexidade computacional (recomendado 10-12).
1.2. Hashing de dados arbitrários
Para verificar a integridade de arquivos ou dados, use os algoritmos SHA-256 ou SHA-3:
<?php$data = "Dados importantes para verificação";$hash_sha256 = hash('sha256', $data);$hash_sha3_256 = hash('sha3-256', $data);
echo "SHA-256: " . $hash_sha256 . PHP_EOL;echo "SHA3-256: " . $hash_sha3_256 . PHP_EOL;
// Verificação de integridade de arquivo$file_hash = hash_file('sha256', '/path/to/file.zip');echo "Hash do arquivo: " . $file_hash;?>2. Criptografia simétrica em PHP
A criptografia simétrica usa uma única chave para criptografar e descriptografar dados. O PHP suporta OpenSSL e Sodium.
2.1. Criptografia via OpenSSL (AES-256-GCM)
O modo recomendado é AES-256-GCM, que fornece autenticação de dados:
<?php$data = "Mensagem secreta";$key = random_bytes(32); // Chave de 256 bits$iv = random_bytes(12); // Vetor de inicialização de 96 bits
// Criptografia$encrypted = openssl_encrypt( $data, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag);
// Descriptografia$decrypted = openssl_decrypt( $encrypted, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag);
echo "Dados originais: " . $data . PHP_EOL;echo "Descriptografados: " . $decrypted . PHP_EOL;echo "Tag de autenticação: " . bin2hex($tag);?>Importante: armazene $key e $iv (ou sua combinação) para descriptografia. A tag $tag verifica a integridade dos dados.
2.2. Criptografia via Sodium (libsodium)
A partir do PHP 7.2, o Sodium faz parte do núcleo. É mais simples e seguro:
<?php$data = "Informação confidencial";$key = sodium_crypto_secretbox_keygen(); // Geração de chave$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
// Criptografia$ciphertext = sodium_crypto_secretbox($data, $nonce, $key);
// Descriptografia$decrypted = sodium_crypto_secretbox_open($ciphertext, $nonce, $key);
echo "Criptografado: " . base64_encode($ciphertext) . PHP_EOL;echo "Descriptografado: " . $decrypted . PHP_EOL;
// Limpeza de memóriasodium_memzero($key);?>3. Criptografia assimétrica (RSA)
A criptografia assimétrica usa um par de chaves (pública/privada). É usada para transmissão segura de dados:
<?php// Geração de chaves$config = [ 'private_key_bits' => 2048, 'private_key_type' => OPENSSL_KEYTYPE_RSA,