Cómo encriptar y desencriptar una cadena en Laravel

Laravel

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.

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.


Avatar de Edu Lazaro

Edu Lázaro: Ingeniero técnico en informática, actualmente trabajo como desarrollador web y programador de videojuegos.

👋 Hola! Soy Edu, me encanta crear cosas y he redactado esta guía. Si te ha resultado útil, el mayor favor que me podrías hacer es el de compatirla en Twitter 😊

Si quieres conocer mis proyectos, sígueme en Twitter.

2 comentarios en “Cómo encriptar y desencriptar una cadena en Laravel

  1. 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!!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

“- Hey, Doc. No tenemos suficiente carretera para ir a 140/h km. - ¿Carretera? A donde vamos, no necesitaremos carreteras.”