Criptografía en PHP: cifrado y hash — guía completa
En el desarrollo web moderno, la seguridad de los datos es una de las prioridades clave. PHP proporciona potentes herramientas integradas para la protección criptográfica: desde el simple hash de contraseñas hasta el complejo cifrado asimétrico. En este artículo analizaremos los enfoques principales, las bibliotecas y las mejores prácticas para trabajar con criptografía en PHP.
1. Hash de datos
El hash es una transformación irreversible de datos en una cadena de longitud fija. Se utiliza para almacenar contraseñas, verificar la integridad de archivos y crear firmas digitales.
1.1. Hash de contraseñas (password_hash)
A partir de PHP 5.5, para el hash de contraseñas se recomienda usar la función password_hash(). Esta selecciona automáticamente un algoritmo seguro (por defecto bcrypt) y genera un salt.
<?php// Hash de contraseña$password = 'MySecurePassword123!';$hash = password_hash($password, PASSWORD_DEFAULT);
echo "Hash: " . $hash . "";
// Verificación de contraseñaif (password_verify($password, $hash)) { echo "¡Contraseña correcta!";} else { echo "¡Contraseña incorrecta!";}?>1.2. Hash con hash()
Para otros propósitos (por ejemplo, sumas de verificación de archivos) use la función hash() con algoritmos SHA-256, SHA-512 o BLAKE2.
<?php$data = "Datos secretos";$sha256_hash = hash('sha256', $data);$blake2b_hash = hash('blake2b', $data);
echo "SHA-256: " . $sha256_hash . "";echo "BLAKE2b: " . $blake2b_hash . "";?>2. Cifrado simétrico
El cifrado simétrico usa la misma clave para cifrar y descifrar datos. En PHP se utiliza la extensión OpenSSL para esto.
2.1. Cifrado con AES-256-GCM (cifrado autenticado)
El modo recomendado es AES-256-GCM, que proporciona confidencialidad y verificación de integridad.
<?php$plaintext = "Mensaje confidencial";$key = random_bytes(32); // Clave de 256 bits$iv = random_bytes(12); // Vector de inicialización de 96 bits
// Cifrado$ciphertext = openssl_encrypt( $plaintext, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag);
echo "Datos cifrados (base64): " . base64_encode($ciphertext) . "";echo "Tag de autenticación: " . bin2hex($tag) . "";
// Descifrado$decrypted = openssl_decrypt( $ciphertext, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag);
echo "Descifrado: " . $decrypted . "";?>2.2. Cifrado con AES-256-CBC (para compatibilidad)
Si se requiere compatibilidad con sistemas antiguos, use AES-256-CBC con HMAC para verificación de integridad.
<?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("¡Integridad de datos comprometida!"); } return openssl_decrypt($ciphertext, 'aes-256-cbc', $key, OPENSSL_RAW_DATA, $iv);}
$key = random_bytes(32);$encrypted = encryptAesCbc("Datos secretos", $key);echo "Cifrado: " . $encrypted . "";echo "Descifrado: " . decryptAesCbc($encrypted, $key) . "";?>3. Cifrado asimétrico
El cifrado asimétrico usa un par de claves: pública (para cifrado) y privada (para descifrado).
También en la biblioteca
Creación de herramientas CLI en Node.js: revisión de los frameworks Commander, Yargs e Inquirer
Procesamiento de JSON en Kotlin: bibliotecas y ejemplos de uso
Configuración de aplicaciones en C++: bibliotecas y herramientas para una configuración flexible