Como encriptar y desencriptar información en PHP

La información es muy valiosa y en algunos casos puede motivar a personas a intentar hackear tu servidor o aplicación, para poder robarla. Una práctica común y muy necesaria hoy en día, es añadir una capa de seguridad para esta información, encriptando los datos más importantes, haciéndolos inútil para cualquier persona que logre robarla.

Como encriptar información usando PHP

Primero crea un archivo llamado mcript.php en tu servidor con este código:

<?php
//Configuración del algoritmo de encriptación
//Debes cambiar esta cadena, debe ser larga y unica
//nadie mas debe conocerla
$clave  = 'Una cadena, muy, muy larga para mejorar la encriptacion';
//Metodo de encriptación
$method = 'aes-256-cbc';
// Puedes generar una diferente usando la funcion $getIV()
$iv = base64_decode("C9fBxl1EWtYTL1/M8jfstw==");
 /*
 Encripta el contenido de la variable, enviada como parametro.
  */
 $encriptar = function ($valor) use ($method, $clave, $iv) {
     return openssl_encrypt ($valor, $method, $clave, false, $iv);
 };
 /*
 Desencripta el texto recibido
 */
 $desencriptar = function ($valor) use ($method, $clave, $iv) {
     $encrypted_data = base64_decode($valor);
     return openssl_decrypt($valor, $method, $clave, false, $iv);
 };
 /*
 Genera un valor para IV
 */
 $getIV = function () use ($method) {
     return base64_encode(openssl_random_pseudo_bytes(openssl_cipher_iv_length($method)));
 };

No olvides cambiar el texto en la variable $clave y generar otro valor para $iv. En el código anterior está toda la configuración para que puedas encriptar o desencriptar cualquier variable, también hay dos funciones que puedes usar para encriptar y desencriptar respectivamente. Y una tercera para generar un valor para la variable $iv.

Aquí hay un ejemplo de cómo puedes usarlas, solo debes crear un archivo con este código:

<?php
include "mcript.php";
// Como usar las funciones para encriptar y desencriptar.
$dato = "Esta es información importante";
//Encripta información:
$dato_encriptado = $encriptar($dato);
//Desencripta información:
$dato_desencriptado = $desencriptar($dato_encriptado);
echo 'Dato encriptado: '. $dato_encriptado . '<br>';
echo 'Dato desencriptado: '. $dato_desencriptado . '<br>';
echo "IV generado: " . $getIV();

Puedes usar las funciones $encriptar() y $encriptar. Si te preguntas por qué las funciones parecen ser variables y llevan un signo de $… Bueno esto es porque las declare como funciones anónimas, actualmente esta es la mejor práctica para compartir variables entre dos funciones, sin tener que recibirlas como parámetros o crear una clase. De esta forma no necesitas enviar en cada función los datos de encriptación.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

10 Comments

  1. Al aplicar el codigo me genera signos de + por lo que al pasar el resultado encriptado mediante GET pierdo el valor ya que interpreta el + como un espacio en blanco. Que recomiendas?

    1. Hola, si estás enviando algo por GET, entonces debes codificarlo primero usando la función urlencode(), luego cuando la lees la decodificas usando urldecode()

    2. Jorshua Gomezsays:

      Pasaba por acá, dos años después ;D….

      $encriptar(urlencode($dato));

      $desencriptar(urldecode($dato_encriptado));

      A alguien más le puede servir… Me gustó el código, gracias Icruz

  2. No entiendo como casi en 2020 alguien se atreveria a encriptar y desencriptar con openssl_encrypt, y aun menos como alguien pueda dar este consejo existiendo SODIUM en PHP desde hace casi 2 años.

    1. Hola, gracias por tu comentario, tienes razón en que existe una alternativa más moderna (SODIUM), pero openssl_encrypt sigue siendo valida y no tiene problemas de seguridad o alguna recomendación de no seguirla usando. Además, funciona con php 5.6, que aunque te sorprenda, php5.6 se usan en el 40% de servidores a nivel mundial (https://w3techs.com/technologies/details/pl-php/5)

      Si tienes información sobre vulnerabilidades en openssl_encrypt por favor me la envías para retirar el articulo. De nuevo gracias por comentario, me gusta leer las opiniones de las personas para poder mejorar este sitio. Voy a escribir algo sobre SODIUM

  3. Alexandrox92says:

    Hola, gracias por el aporte, me fue de utilidad pero tengo el mismo problema que el primer comentario, cifro una cadena y en ocasiones agregar signos + los cuales al codificar con URL encode no pasan y al desenciptar la cadena no sirve, algún consejo ?

    gracias

  4. Alexandrox92says:

    Hola, como tal la solución que encontré fue esta y funciona para mi, es tomar la variable y después de hacerle el decode reemplazar los espacios en blanco con el sigo +, así:

    $ticket_cifrado=urldecode($_GET[‘qr’]);
    $ticket_cifrado=str_replace (‘ ‘,’+’, $ticket_cifrado );

    Asi se puede solventar el tema de los + que aunque se use urlencode no son compatibles con este método de cifrado.

  5. Marvin Acostasays:

    Una pregunta, si encripto un dato de un campo a la base de datos, pero uso la función que genera diferentes IV, ésta está relacionado con el script específicamente, es decir luego cuando quiera desencriptar el dato almacenado, y mostrarlo, no afectaría porque se genera otro IV, diferente.?

    1. La funcion para generar el IV es solo para generes uno diferente al que muestro en el ejemplo, el valor que generas deberias de guardarlo y quedarte usando ese siempre.

      Puedes tener un archivo de configuración y ahí guardarlo como se hace con los password de la base de datos.

  6. muy buen aporte, en muchos sitios de hosting “compartido” no esta instalada la extension SODIUM, openssl es la vieja confiable