Volver a la página principal
lunes 4 noviembre 2024
77

Cómo usar openssl_encrypt y openssl_decrypt en PHP

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.

¿Qué son openssl_encrypt y openssl_decrypt y cómo funcionan?

  • openssl_encrypt: Encripta una cadena de texto utilizando un algoritmo de cifrado específico y una clave.
  • openssl_decrypt: Desencripta una cadena de texto cifrada utilizando el mismo algoritmo y clave.

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.

Sintaxis de 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

Sintaxis de openssl_decrypt

openssl_decrypt(
    string $data,
    string $cipher_algo,
    string $key,
    int $options = 0,
    string $iv = "",
    string $tag = "",
    string $aad = ""
): string|false

Parámetros principales

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.

Ejemplos de uso de openssl_encrypt y openssl_decrypt

Ejemplo 1: Encriptar y desencriptar con AES-256-CBC

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

Ejemplo 2: Encriptar y desencriptar con autenticación (AES-128-GCM)

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

Consideraciones de seguridad

  • Longitud de la clave: Asegúrate de usar una clave que tenga la longitud requerida para el algoritmo seleccionado.
  • Vector de inicialización (IV): Algunos algoritmos requieren un IV. Utiliza siempre un IV único y aleatorio para cada encriptación.
  • Almacenamiento del IV y el tag: Incluye el IV y el tag (si corresponde) con el mensaje encriptado, ya que son necesarios para la desencriptación.

Referencia

Para más información sobre openssl_encrypt y openssl_decrypt, consulta la documentación oficial de PHP.

Etiquetas:
php
Compartir:
Creado por:
Author photo

Jorge García

Fullstack developer