Saltar contenido

Cifrado

Introducción

Los servicios de cifrado de Laravel proporcionan una interfaz simple y conveniente para cifrar y descifrar texto a través de OpenSSL utilizando cifrado AES-256 y AES-128. Todos los valores cifrados de Laravel están firmados utilizando un código de autenticación de mensaje (MAC) para que su valor subyacente no pueda ser modificado o manipulado una vez cifrado.

Configuración

Antes de usar el encriptador de Laravel, debes configurar la opción key en tu archivo de configuración config/app.php. Este valor de configuración está controlado por la variable de entorno APP_KEY. Debes usar el comando php artisan key:generate para generar el valor de esta variable, ya que el comando key:generate utilizará el generador de bytes aleatorios seguros de PHP para construir una clave criptográficamente segura para tu aplicación. Típicamente, el valor de la variable de entorno APP_KEY será generado por ti durante la instalación de Laravel.

Rotación de Claves de Encriptación de Manera Elegante

Si cambias la clave de encriptación de tu aplicación, todas las sesiones de usuario autenticadas se cerrarán en tu aplicación. Esto se debe a que cada cookie, incluidas las cookies de sesión, son encriptadas por Laravel. Además, ya no será posible desencriptar cualquier dato que fue encriptado con tu clave de encriptación anterior. Para mitigar este problema, Laravel te permite enumerar tus claves de encriptación anteriores en la variable de entorno APP_PREVIOUS_KEYS de tu aplicación. Esta variable puede contener una lista delimitada por comas de todas tus claves de encriptación anteriores:

APP_KEY="base64:J63qRTDLub5NuZvP+kb8YIorGS6qFYHKVo6u7179stY="
APP_PREVIOUS_KEYS="base64:2nLsGFGzyoae2ax3EF2Lyq/hH6QghBGLIq5uL+Gp8/w="

Cuando configuras esta variable de entorno, Laravel siempre utilizará la clave de encriptación "actual" al encriptar valores. Sin embargo, al desencriptar valores, Laravel primero intentará con la clave actual, y si la desencriptación falla utilizando la clave actual, Laravel intentará con todas las claves anteriores hasta que una de las claves pueda desencriptar el valor. Este enfoque de desencriptación elegante permite a los usuarios seguir utilizando tu aplicación sin interrupciones, incluso si se rota tu clave de cifrado.

Usando el Encrypter

Encriptando un Valor

Puedes cifrar un valor utilizando el método encryptString proporcionado por la fachada Crypt. Todos los valores cifrados se cifran utilizando OpenSSL y el cifrador AES-256-CBC. Además, todos los valores cifrados están firmados con un código de autenticación de mensaje (MAC). El código de autenticación de mensaje integrado evitará la descifrado de cualquier valor que haya sido manipulado por usuarios malintencionados:

<?php
 
namespace App\Http\Controllers;
 
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Crypt;
 
class DigitalOceanTokenController extends Controller
{
/**
* Store a DigitalOcean API token for the user.
*/
public function store(Request $request): RedirectResponse
{
$request->user()->fill([
'token' => Crypt::encryptString($request->token),
])->save();
 
return redirect('/secrets');
}
}

Desencriptando un Valor

Puedes descifrar valores utilizando el método decryptString proporcionado por la fachada Crypt. Si el valor no puede ser descifrado correctamente, como cuando el código de autenticación del mensaje es inválido, se lanzará una Illuminate\Contracts\Encryption\DecryptException:

use Illuminate\Contracts\Encryption\DecryptException;
use Illuminate\Support\Facades\Crypt;
 
try {
$decrypted = Crypt::decryptString($encryptedValue);
} catch (DecryptException $e) {
// ...
}