Criptografía en PHP: cifrado y hash — guía completa

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

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

Recommendations