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.

Como encriptar y desencriptar información en PHP

7 comentarios en «Como encriptar y desencriptar información en PHP»

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

Deja una respuesta

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

Scroll hacia arriba