Para cifrar y descifrar datos en PHP, se pueden utilizar varias bibliotecas y métodos seguros y modernos. Dos de las opciones más confiables y recomendadas son la función incorporada `openssl` y la extensión `sodium`. A continuación, se muestra cómo utilizar ambas de manera adecuada:
PHP proporciona la extensión `openssl` que es muy versátil para manejar distintas operaciones criptográficas. Aquí se presenta un ejemplo de cómo cifrar y descifrar datos utilizando `openssl` en PHP.
1. Cifrado con `openssl`:
```php
$data = “Datos que se quieren cifrar”;
$key = “clave_secreta123456”; // La clave debe ser de una longitud adecuada para el método de cifrado
$method = ‘aes-256-cbc’;
$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length($method));
$encrypted = openssl_encrypt($data, $method, $key, 0, $iv);
$encrypted = base64_encode($iv . $encrypted);
echo “Datos cifrados: “ . $encrypted;
?>
```
2. Descifrado con `openssl`:
```php
$encrypted = “el_texto_cifrado_obtenido”; // El texto cifrado obtenido del paso anterior
$key = “clave_secreta123456”; // Debe ser la misma clave utilizada para cifrar
$method = ‘aes-256-cbc’;
$iv_length = openssl_cipher_iv_length($method);
$encrypted = base64_decode($encrypted);
$iv = substr($encrypted, 0, $iv_length);
$encrypted = substr($encrypted, $iv_length);
$decrypted = openssl_decrypt($encrypted, $method, $key, 0, $iv);
echo “Datos descifrados: “ . $decrypted;
?>
```
PHP también incluye la biblioteca `sodium`, que es parte de la extensión `libsodium`, más moderna y recomendada para nuevas aplicaciones debido a su perfil de seguridad superior.
1. Cifrado con `sodium`:
```php
$data = “Datos que se quieren cifrar”;
$key = sodium_crypto_secretbox_keygen();
$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
$ciphertext = sodium_crypto_secretbox($data, $nonce, $key);
echo “Datos cifrados: “ . base64_encode($nonce . $ciphertext);
?>
```
2. Descifrado con `sodium`:
```php
$encrypted = “el_texto_cifrado_obtenido”; // El texto cifrado obtenido del paso anterior
$encrypted = base64_decode($encrypted);
$key = “la_misma_clave_utilizada_para_cifrar”;
$nonce = substr($encrypted, 0, SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
$ciphertext = substr($encrypted, SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
$decrypted = sodium_crypto_secretbox_open($ciphertext, $nonce, $key);
if ($decrypted === false) {
throw new Exception(“Desencriptado fallido.”);
}
echo “Datos descifrados: “ . $decrypted;
?>
```
Estas prácticas de cifrado son recomendadas porque `aes-256-cbc` (para `openssl`) y `sodium_crypto_secretbox` (para `libsodium`) son métodos muy seguros cuando se usan adecuadamente. Siempre es crucial asegurarse de que las claves y otros parámetros criptográficos sean gestionados de manera segura.
- Documentación de PHP sobre openssl:
https://www.php.net/manual/es/book.openssl.php
- Documentación de PHP sobre sodium:
https://www.php.net/manual/es/book.sodium.php
Estos métodos no solo garantizan la seguridad de los datos cifrados, sino que también aseguran que los datos puedan ser descifrados sólo por aquellos que posean la clave secreta correcta, protegiendo así la información sensible de accesos no autorizados.