Las funciones openssl_encrypt
y openssl_decrypt
en PHP permiten encriptar y desencriptar datos de forma segura utilizando el estándar OpenSSL. Estas funciones son útiles para proteger datos sensibles, como contraseñas o información personal, en aplicaciones web. Al aplicar un método de cifrado y una clave segura, se puede garantizar la integridad y confidencialidad de los datos.
openssl_encrypt
y openssl_decrypt
y cómo funcionan?
Estas funciones requieren tres elementos esenciales: el algoritmo de cifrado, una clave de encriptación y, opcionalmente, un IV (vector de inicialización), dependiendo del tipo de cifrado.
openssl_encrypt
openssl_encrypt(
string $data,
string $cipher_algo,
string $key,
int $options = 0,
string $iv = "",
string &$tag = null,
string $aad = "",
int $tag_length = 16
): string|false
openssl_decrypt
openssl_decrypt(
string $data,
string $cipher_algo,
string $key,
int $options = 0,
string $iv = "",
string $tag = "",
string $aad = ""
): string|false
Parámetro | Descripción |
---|---|
$data
|
La cadena que se desea encriptar o desencriptar. |
$cipher_algo
|
Algoritmo de cifrado, como AES-256-CBC o AES-128-CTR .
|
$key
|
Clave de encriptación. Debe tener una longitud adecuada según el algoritmo usado. |
$options
|
Opciones de encriptado, donde 0 aplica el valor por defecto (normalmente seguro).
|
$iv
|
Vector de inicialización (IV). Algunos algoritmos requieren un IV para ser seguros. |
$tag
|
(Solo encriptación) Usado en algoritmos de autenticación, como AES-128-GCM , para asegurar la integridad.
|
$aad
|
Datos adicionales de autenticación, útiles en algunos algoritmos de autenticación. |
openssl_encrypt
y openssl_decrypt
En este ejemplo, utilizamos el algoritmo AES-256-CBC
para encriptar y desencriptar datos. AES-256-CBC
requiere un IV de 16 bytes.
$data = "Este es el mensaje a cifrar";
$key = "clave_super_secreta_1234567890123456"; // Debe ser de 32 caracteres para AES-256
$cipher_algo = "AES-256-CBC";
$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length($cipher_algo));
// Encriptar
$encrypted = openssl_encrypt($data, $cipher_algo, $key, 0, $iv);
$encrypted = base64_encode($iv . $encrypted); // Almacenamos el IV junto con el mensaje encriptado
echo "Mensaje encriptado: " . $encrypted . "\n";
// Desencriptar
$decoded = base64_decode($encrypted);
$iv_decoded = substr($decoded, 0, openssl_cipher_iv_length($cipher_algo)); // Separar el IV
$encrypted_data = substr($decoded, openssl_cipher_iv_length($cipher_algo));
$decrypted = openssl_decrypt($encrypted_data, $cipher_algo, $key, 0, $iv_decoded);
echo "Mensaje desencriptado: " . $decrypted . "\n";
Salida:
Mensaje encriptado: <texto_encriptado>
Mensaje desencriptado: Este es el mensaje a cifrar
En este ejemplo, usamos AES-128-GCM
, que ofrece autenticación. Este algoritmo requiere un IV, un tag y puede incluir datos adicionales (AAD) para validar la integridad.
$data = "Mensaje confidencial";
$key = "clave_secreta_1234"; // 16 caracteres para AES-128
$cipher_algo = "AES-128-GCM";
$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length($cipher_algo));
$tag = null;
// Encriptar
$encrypted = openssl_encrypt($data, $cipher_algo, $key, 0, $iv, $tag);
$encrypted = base64_encode($iv . $tag . $encrypted); // Almacenar IV y tag junto con el mensaje
echo "Mensaje encriptado (con autenticación): " . $encrypted . "\n";
// Desencriptar
$decoded = base64_decode($encrypted);
$iv_decoded = substr($decoded, 0, openssl_cipher_iv_length($cipher_algo));
$tag_decoded = substr($decoded, openssl_cipher_iv_length($cipher_algo), 16);
$encrypted_data = substr($decoded, openssl_cipher_iv_length($cipher_algo) + 16);
$decrypted = openssl_decrypt($encrypted_data, $cipher_algo, $key, 0, $iv_decoded, $tag_decoded);
echo "Mensaje desencriptado: " . $decrypted . "\n";
Salida:
Mensaje encriptado (con autenticación): <texto_encriptado>
Mensaje desencriptado: Mensaje confidencial
Para más información sobre openssl_encrypt
y openssl_decrypt
, consulta la documentación oficial de PHP.
Jorge García
Fullstack developer