En este tutorial vamos a ver cómo puedes encriptar y desencriptar cadenas de texto usando el framework Laravel. Sin embargo, explicaremos primero ciertos conceptos básicos de criptografía.
El encriptado es el proceso de encriptar información de forma que no pueda ser entendida o interceptada por terceros. El encriptado no es algo nuevo, sino que lleva usándose desde hace hace casi 4000 años. De hecho los primeros vestigios de estos procesos se remontan al antiguo Egipto. Existen técnicas de encriptado tan simples como el cifrado César, también conocido como cifrado por desplazamiento, en el que cada letra del texto original se cambia por otra letra que se encuentra un número fijo de posiciones por delante en el alfabeto.
A día de hoy cualquier ordenador es capaz de desencriptar textos que usan las técnicas más simples. Es por ello que Laravel te proporciona una técnica de encriptado que hace uso de OpenSSL, con encriptado AES de 256 bits, de modo que no tengas que reinventar la rueda con tu propio algoritmo de encriptado. En este tutorial vamos a ver cómo encriptar y desencriptar texto usando los métodos que Laravel proporciona.
Contenidos
Configuración inicial
Antes de comenzar, debes asegurarte de que has generado una clave de encriptado en Laravel. Aunque no la hayas generado, el encriptado funcionará igualmente, pero podría ser inseguro. En caso de que no la tengas generada o si no estás seguro de ello, usa el siguiente domando:
php artisan key:generate
Cómo encriptar una cadena
Para encriptar una cadena deberás incluir la siguiente clase en el archivo o en la clase en la que vayas a encriptar cadenas:
use Illuminate\Support\Facades\Crypt;
Para encriptar una cadena basta con que uses el método encryptString
de la clase Crypt
:
$cadenaEncriptada = Crypt::encryptString('Aquí una cadena de texto');
Y con esto ya habrás encriptado la cadena, por lo que puedes proceder a guardarla en la base de datos o a realizar cualquier otra tarea con ella.
Cómo desencriptar una cadena
Para desencriptar una cadena también deberás incluir la siguiente clase en el archivo o en la clase en la que vayas a desencriptar cadenas:
use Illuminate\Support\Facades\Crypt;
Lo más normal es desencriptar cadenas que tengas almacenadas en la base de datos o que hayas obtenido mediante alguna API. Para desencriptar una cadena tendrás que usar el método decryptString
de la clase Crypt
:
$cadenaDesencriptada = Crypt::decryptString('i2bHjCNHs0cOtKTj0VkNH8PLSIVa');
Tras desencriptar la cadena ya habrás obtenido de nuevo la cadena original:
echo($cadenaDesencriptada); // Aquí una cadena de texto
Crea una aplicación de encriptado
A continuación vamos a ver cómo crear una pequeña aplicación de encriptado y desencriptado con Laravel. Para ello crearemos un controlador y dos rutas.
Creación de las rutas
Crearemos primero las dos rutas en el archivo routes/web.php
de Laravel:
Route::get('encriptar/{cadena}', EncryptionController@encriptar');
Route::get('desencriptar/{cadena}', EncryptionController@desencriptar');
Decir que por respetar los estándares de Laravel, es recomendable usar la nomenclatura NombreController
. De hecho en mis proyectos personales suelo programar todo en inglés, ya que de este modo abres la puerta a la participación de más personas en tus proyectos.
En la ruta /encriptar
realizaremos el proceso de encriptado de la cadena que proporcionemos mediante el parámetro cadena
. Del mismo modo, en la ruta /desencriptar
, desencriptaremos la cadena que pasemos como parámetro.
Creación del controlador
Ahora crearemos el controlador EncryptionController
. Para ello podemos usar el siguiente comando de artisan
, desde la terminal de comandos:
php artisan make:controller EncryptionController
Esto creará el archivo app/Http/Controllers/EncryptionController.php
, que tendremos que editar.
Lo primero que tenemos que hacer es incluir la clase Crypt
en la parte superior del archivo:
use Illuminate\Support\Facades\Crypt;
Ahora vamos a crear dos métodos públicos. El método encriptar
se encargará de encriptar una cadena usando el método estático Crypt::encryptString
:
public function encriptar(Request $request)
{
$cadena = $request->route('cadena', false);
if (!$cadena) echo('Debes proporcionar una cadena!')
$cacena = urldecode($cadena);
$cadenaEncriptada = Crypt::encryptString($cadena);
print_r($cadenaEncriptada);
}
El método desencriptar
se encargará de desencriptar una cadena encriptada que pasemos como parámetro usando el método estático Crypt::decryptString
:
public function desencriptar(Request $request)
{
$cadena = $request->route('cadena', false);
if (!$cadena) echo('Debes proporcionar una cadena!')
$cacena = urldecode($cadena);
$cadenaDesencriptada = Crypt::decryptString($cadena);
print_r($cadenaDesencriptada);
}
Dado que enviamos la cadena como parámetro GET
, esta estará codificada, por lo que tal y como puedes ver, la decodificamos primero usando la función urldecode de PHP. Es importante que la cadena que pasemos al método decryptString
haya sido encriptada con el método encryptString
y con la misma clave de encriptado establecida en la configuración de Laravel.
Probando la aplicación
Si ahora visitas la URL mi-dominio.localhost/encriptar/hola
, reemplazando mi-dominio.localhost
por el dominio local en donde has instalado Laravel, la cadena hola
se encriptará y se mostrará por pantalla.
Si luego accedes a la URL mi-dominio.localhost/desencriptar/AQUILACADENAENCRIPTADA
, reemplazando mi-dominio.localhost
por el dominio local en donde has instalado y AQUILACADENAENCRIPTADA
por la versión encriptada de la cadena hola
, verás que se muestra hola
por pantalla.
Esto ha sido solo un ejemplo que distaría bastante del uso real del encriptado con la clase Crypt
. En un escenario real tendrías que enviar los parámetros mediante peticiones POST
o todavía mejor, usar una API.
Y esto ha sido todo.
Muchas gracias por compartir!! , buenisimo tutorial
Muchas gracias Interesante metodo, una consulta si quisiera encriptar campos como correo, telefono, dni en un front Vuejs y pasarlos a la api laravel desencriptar para poder guardar y actualizar, que me recomendarias hacer? De antemano gracias!!