Criptografía en PHP: cifrado y hashing de datos
La seguridad de las aplicaciones web es una de las tareas clave del desarrollador. PHP proporciona potentes herramientas integradas para la protección criptográfica de datos. En este artículo veremos dos direcciones principales: cifrado (transformación de datos con posibilidad de recuperación inversa) y hashing (transformación unidireccional para verificar la integridad).
1. Hashing en PHP
El hashing se utiliza para almacenar contraseñas, sumas de verificación y verificar la integridad de los datos. En PHP se utilizan las funciones password_hash() y hash() para estos fines.
1.1. Hashing seguro de contraseñas
Nunca use md5 o sha1 para almacenar contraseñas. Use el algoritmo bcrypt a través de password_hash():
<?php// Hashing de contraseña$password = 'MySecureP@ss123';$hash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);
echo $hash; // $2y$12$...
// Verificación de contraseñaif (password_verify('MySecureP@ss123', $hash)) { echo "¡Contraseña correcta!";} else { echo "¡Contraseña incorrecta!";}?>La función password_hash() genera automáticamente una sal y utiliza un algoritmo seguro. El parámetro cost ajusta la complejidad computacional (se recomienda 10-12).
1.2. Hashing de datos arbitrarios
Para verificar la integridad de archivos o datos, use los algoritmos SHA-256 o SHA-3:
<?php$data = "Datos importantes para verificar";$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;
// Verificación de integridad de archivo$file_hash = hash_file('sha256', '/path/to/file.zip');echo "Hash del archivo: " . $file_hash;?>2. Cifrado simétrico en PHP
El cifrado simétrico utiliza una sola clave para cifrar y descifrar datos. PHP es compatible con OpenSSL y Sodium.
2.1. Cifrado con OpenSSL (AES-256-GCM)
El modo recomendado es AES-256-GCM, que proporciona autenticación de datos:
<?php$data = "Mensaje secreto";$key = random_bytes(32); // Clave de 256 bits$iv = random_bytes(12); // Vector de inicialización de 96 bits
// Cifrado$encrypted = openssl_encrypt( $data, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag);
// Descifrado$decrypted = openssl_decrypt( $encrypted, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag);
echo "Datos originales: " . $data . PHP_EOL;echo "Descifrados: " . $decrypted . PHP_EOL;echo "Etiqueta de autenticación: " . bin2hex($tag);?>Importante: guarde $key y $iv (o su combinación) para el descifrado. La etiqueta $tag verifica la integridad de los datos.
2.2. Cifrado con Sodium (libsodium)
A partir de PHP 7.2, Sodium es parte del núcleo. Es más simple y seguro:
<?php$data = "Información confidencial";$key = sodium_crypto_secretbox_keygen(); // Generación de clave$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
// Cifrado$ciphertext = sodium_crypto_secretbox($data, $nonce, $key);
// Descifrado$decrypted = sodium_crypto_secretbox_open($ciphertext, $nonce, $key);
echo "Cifrado: " . base64_encode($ciphertext) . PHP_EOL;echo "Descifrado: " . $decrypted . PHP_EOL;
// Limpieza de memoriasodium_memzero($key);?>3. Cifrado asimétrico (RSA)
El cifrado asimétrico utiliza un par de claves (pública/privada). Se utiliza para la transmisión segura de datos:
<?php// Generación de claves$config = [ 'private_key_bits' => 2048, 'private_key_type' => OPENSSL_KEYTYPE_RSA, También en la biblioteca
Cliente Redis para Java: Jedis, Lettuce y Redisson — descripción general y ejemplos
Awilix para TypeScript: guía completa del contenedor DI
doctest para C++: guía completa con ejemplos prácticos
Sarama para Go: guía completa con ejemplos
Cliente OAuth para Go (Golang): Conexión a proveedores OAuth 2.0