Criptografía en PHP: cifrado y hash de datos
En el desarrollo web moderno, la seguridad de los datos no es una opción, sino un requisito obligatorio. PHP proporciona un potente arsenal de herramientas para la protección criptográfica, dividido en dos áreas principales: cifrado (transformación reversible de datos) y hash (transformación irreversible). En este artículo, exploraremos las bibliotecas y funciones clave de PHP para ambas tareas con ejemplos prácticos.
1. Conceptos básicos de criptografía en PHP
Antes de pasar al código, es importante distinguir entre dos tipos de operaciones:
- Cifrado — transformación de datos con la posibilidad de recuperar el texto original si se posee la clave. Se utiliza para transmitir información confidencial.
- Hash — transformación unidireccional donde es imposible recuperar los datos originales. Se aplica para almacenar contraseñas y verificar la integridad.
PHP utiliza las extensiones openssl (para cifrado) y password_hash/hash (para hash).
2. Cifrado de datos en PHP
2.1. Cifrado simétrico (AES)
El algoritmo más popular es AES-256-GCM, que ofrece alto rendimiento y autenticación integrada.
<?php// Cifrado$data = "Mensaje secreto";$key = openssl_random_pseudo_bytes(32); // Clave de 256 bits$iv = openssl_random_pseudo_bytes(12); // Vector de 96 bits para GCM
$encrypted = openssl_encrypt( $data, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag);
// Codificación en base64 para transmisión$encrypted_base64 = base64_encode($iv . $tag . $encrypted);
// Descifrado$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 "Descifrado: " . $decrypted; // Mensaje secreto?>Importante: Nunca use el modo ECB, no es seguro. Utilice siempre GCM o CBC con HMAC.
2.2. Cifrado asimétrico (RSA)
Para el intercambio de claves y firmas digitales se utiliza RSA. PHP emplea un par de claves (pública/privada).
<?php// Generación de claves$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'];
// Cifrado con clave pública$data = "Datos confidenciales";openssl_public_encrypt($data, $encrypted, $publicKey);
// Descifrado con clave privadaopenssl_private_decrypt($encrypted, $decrypted, $privateKey);
echo $decrypted; // Datos confidenciales?>3. Hash de contraseñas
El hash de contraseñas es una tarea crítica. PHP proporciona funciones especializadas que ajustan automáticamente la sal y el costo computacional.
3.1. bcrypt (recomendado por defecto)
La función password_hash() con el algoritmo PASSWORD_BCRYPT crea un hash seguro con sal automática.
<?php$password = "UserPassword123!";
// Hash$hash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);echo "Hash: " . $hash . ""; // $2y$12$...
// Verificaciónif (password_verify($password, $hash)) { echo "¡Contraseña correcta!";} else { echo "Contraseña incorrecta";}
// Verificar necesidad de rehashif (password_needs_rehash($hash, PASSWORD_BCRYPT, ['cost' => 12])) { $newHash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);}?>3.2. Argon2 (estándar moderno)
A partir de PHP 7.2