Encriptar datos entre JavaScript y PHP – Clave pública y privada

Encriptar datos entre JavaScript y PHP – Clave pública y privada

Hoy aprenderemos a encriptar datos entre JavaScript y PHP mediante un cifrado asimétrico con clave pública y privada, con esto nuestra información estará encriptada y solo nosotros podremos desencriptarla al recibirla.

Muchas veces al programar sistemas web debemos pasar información de JavaScript a PHP.

Es importante cifrar esta información para evitar que este sin seguridad en la red en peligro de hackers listos para robar nuestra información.

Aquí es cuando uno piensa en un cifrado tradicional simétrico, pero que al exponer la forma de cifrar se vuelve aún inseguro, por esta razón utilizaremos un cifrado asimétrico.

Un cifrado asimétrico, a diferencia de un cifrado simétrico tradicional, se apoya en dos claves: una pública y otra privada.


¿Sabías que?

¿Necesitas aprender algo nuevo ? Ve a Udemy, busca el tema del que quieres aprender, selecciona el curso para ti y continua con tu aprendizaje.

Udemy

La clave pública la podemos exponer en nuestro código JavaScript en el lado del cliente, pero nuestra clave privada estará segura en PHP del lado del servidor.

Veamos ahora cómo  encriptar datos entre JavaScript y PHP mediante el uso de clave pública y clave privada.

Generamos clave pública y privada

Para hacer esto nos apoyamos en la herramienta ssh-keygen en Windows.

Esta herramienta nos permitirá crear nuestras claves pares, iniciamos una consola de Windows y escribimos:

ssh-keygen

Nos pedirá ingresar una ruta donde guardar nuestra clave, la ingresamos y continuamos.

Por último nos pide una frase clave, esta frase debemos recordarla pues la necesitaremos más adelante.

ssh-keygen

Una vez terminado el proceso vamos a la ruta donde se guardó nuestra clave y la copiamos pues la necesitaremos en los siguientes pasos.

Configuraciones iniciales

Para comenzar es necesario subir nuestra clave al servidor.

En mi caso he creado una carpeta llamada enc, allí he puesto mi archivo clave y un archivo llamado enc.php.

Este archivo PHP será el encargado de leer nuestro archivo clave para acceder a nuestra clave pública y privada.

$pk = file_get_contents(realpath(__DIR__.DIRECTORY_SEPARATOR.'clave.pem'));
$kh = openssl_pkey_get_private($pk, "frase clave");
$detalles = openssl_pkey_get_details($kh);

function to_hex($data)
{
    return strtoupper(bin2hex($data));
}

Puedes observar que hacemos uso de nuestra frase clave y que declaramos una función de ayuda.

Aquí hacemos uso de la función file_get_contents que obtiene el contenido de un archivo, openssl_pkey_get_private que obtiene una clave privada y openssl_pkey_get_details que obtiene una matriz con los detalles de la clave.

Conoce la relación de las matemáticas con la programación.

Encriptamos datos con clave pública en JavaScript

Para encriptar datos desde JavaScript primero incluimos el archivo de configuración.

<?php include "enc/enc.php"; ?>

Posteriormente vamos a necesitar algunas librerías de RSA: jsbn.js, prng4.js, rng.js, rsa.js, las podemos obtener en http://www-cs-students.stanford.edu/~tjw/jsbn/.

Las descargamos y luego las importamos a nuestro proyecto, ahora continuamos.

Inicializamos en JavaScript un objeto RSAKey con ayuda de los detalles de nuestra clave:

var rsa = new RSAKey();
rsa.setPublic('<?php echo to_hex($detalles['rsa']['n']) ?>', '<?php echo to_hex($detalles['rsa']['e']) ?>');

Ahora cada que queramos cifrar información vamos a hacer lo siguiente:

datos = rsa.encrypt(datos);

Por ejemplo al enviar información por POST para que la información no vaya en texto plano, ya la desencriptaremos después en PHP.

Desencriptamos datos con clave privada en PHP

Para desencriptar la información en el lado del servidor en PHP necesitamos incluir nuestro archivo de configuración:

include "enc/enc.php";

Utilizaremos la función de PHP openssl_private_decrypt para obtener nuestra información sin cifrar:

$datos= pack('H*', $datos);
if (openssl_private_decrypt($datos, $r, $kh)) {
   $datos = $r;
}

Ahora tendremos la misma información que teníamos antes de cifrar, ¿fácil no?

Cuando alguien se encuentre revisando el tráfico de la red ya no verá datos planos sino datos cifrados por una clave pública y privada, cifrado asimétrico.

Si esta información sobre cómo encriptar datos entre JavaScript y PHP con clave pública y privada te ha sido de utilidad no olvides compartirla en tus redes sociales favoritas y dejarnos un comentario en la sección de abajo, será un placer ayudarte.

¡Hasta luego!

Clic para valorar esta información
[Total: 2 Promedio: 3.5]