¿Cuál es la diferencia entre Encryption, Encoding, Hashing y Obfuscation?

Es importante mantener nuestros datos (y de nuestros usuarios) seguros.

Para ello, es importante conocer los métodos más comunes para ello, y sus diferencias:

Muchas veces se comete el error de usar estos términos como si se tratase de lo mismo.

Y eso puede conllevar a muchos problemas.

Por ello:

En este artículo, vamos a revisar cada uno de estos métodos, y cómo funcionan, a través de ejemplos.

¿Qué es Encoding?

Encoding data, o codificar datos, es un proceso que consiste (simplemente) en cambiar el formato de los datos.

Es decir:

  • Encoding es un proceso reversible.
  • Los datos pueden ser codificados (encoded) a un nuevo formato, y decodificados (decoded) a su formato original.

Como es fácilmente reversible, encoding no debe usarse para proteger datos.

Por el contrario, estos algoritmos suelen ser públicos, para que todos puedan codificar y decodificar fácilmente.

¿En qué casos se usa?

Generalmente para comunicar datos entre sistemas y aplicaciones, usando un formato más conveniente.

Ejemplos de encoding: ASCII, URL Encoding, Base64.

¿Qué es Encryption?

Encryption, o encriptación, es un proceso más seguro para proteger datos:

De tal manera que sólo los usuarios autorizados (con una clave o contraseña) puedan desencriptar (decrypt) el resultado y acceder al contenido original.

Debido a que codificar (encoding) es un término más general:

  • Muchas veces se dice que encriptar consiste en una "codificación segura".
  • Sin embargo, lo adecuado es ser precisos y distinguir encryption de encoding.

Tenemos 2 tipos de encriptación: con clave simétrica, y con clave pública.

  • Con clave simétrica, significa que la misma contraseña es usada para encriptar y desencriptar datos.
  • Con clave de encriptación pública, una otra contraseña distinta es usada para desencriptar.

Ejemplos de encryption: AES 256, Blowfish.

AES significa Advanced Encryption Standard, y usa una clave simétrica.

El nombre indica que se usa una clave de 256 bits.

Es decir, hay 2 elevado a la 256 posibles claves que pueden ser usadas.

¿Qué es Hashing?

Hashing es un proceso unidireccional, donde los datos se transforman a un string alfanumérico, con una longitud fija de caracteres.

  • El string resultante se conoce como hash.
  • Este hash no se puede revertir, ya que se trata de una operación en un solo sentido.
  • Hashing se usa generalmente para verificar la integridad de los datos.

Es importante resaltar que:

  • Si 2 datos idénticos son hasheados, es decir, pasan a través de la misma función hash, el resultado será el mismo.
  • Para entradas diferentes, los hashes resultantes serán diferentes y únicos.
  • Un buen algoritmo de hashing causará que un cambio mínimo en la entrada, produzca una salida muy diferente.

Ejemplos de función hash: SHA-512, MD5 (obsoleto).

Hashing de contraseñas

Hashing es el método recomendado para procesos de autenticación:

  • Es importante nunca guardar contraseñas.
  • En vez de ello, guardar el hash resultante de la “contraseña con sal” (salted password).
  • La sal (salt) es una cadena aleatoria, que se agrega a la contraseña, y que sólo el proceso de autenticación conoce.
  • Esto garantiza que, incluso si 2 usuarios tienen la misma contraseña, los hashes guardados sean distintos.

¿Cómo funciona?

  • Cuando un usuario ingresa su contraseña en una aplicación, ésta es enviada al servidor.
  • El servidor le agrega la "sal" a la contraseña y ejecuta la función de hashing.
  • Finalmente compara el hash resultante con el hash guardado en la base de datos.
  • Si los hashes coinciden para dicho usuario, el inicio de sesión es exitoso.

Usar hashing asegura que, en caso de una filtración de datos (ha ocurrido incluso con big tech companies):

  • Los atacantes no puedan determinar la contraseña de los usuarios.
  • Ni qué usuarios tienen la misma contraseña.

Integridad de mensajes

Hashing se usa también para validar que un mensaje no ha sido alterado, en conjunto con una firma digital.

  • El mensaje a enviar es hasheado, y firmado con la clave secreta del emisor.
  • Cuando el recipiente abre el mensaje, puede validar la firma del hash con la clave pública del emisor,
  • y hashear el mensaje por sí mismo, para finalmente comparar el hash resultante con el que envió el emisor.
  • Si los hashes coinciden, el mensaje fue enviado por la persona correcta y no modificado.

Proceso de enviar un mensaje hasheado y firmado digitalmente

Bonus: ¿Qué es Obfuscation?

Ofuscar consiste en hacer algo más difícil de entender.

Usualmente para evitar que sea atacado, o copiado.

Un uso muy común es ofuscar código fuente:

De tal manera que sea difícil plagiar o hacer ingeniería inversa de un producto.

Es importante resaltar que:

  • La ofuscación no protege datos exactamente. Es más bien, un obstáculo.
  • Se puede hacer ingeniería inversa de un código ofuscado, pero requerirá de mucho tiempo y esfuerzo, además de ser un proceso manual.

No existe una limitación respecto a qué tanto se puede ofuscar un código:

Cuando se trata de código fuente, lo importante es que el resultado pueda seguir siendo consumido por una computadora, o la aplicación dejará de funcionar.

Código ofuscado

Ejemplos de ofuscadores: JavaScript Obfuscator, ProGuard.

Resumen

  • Encoding: Transformar datos a un nuevo formato. Es reversible.
  • Encryption: Datos protegidos, con una contraseña que permite desencriptar.
  • Hashing: Proceso en una sola dirección (no reversible). Usado para validar la integridad de datos.
  • Obfuscation: Dificulta entender el significado. Usado generalmente para código de computadora.

Referencias

# sesiones # jwt # ssl

Logo de Programación y más

Comparte este post si te fue de ayuda 🙂.

Regístrate

Accede a todos los cursos, y resuelve todas tus dudas.

Cursos Recomendados

Imagen para el curso Laravel y OAuth2

Laravel y OAuth2

Veamos cómo implementar un login mediante redes sociales! Aprende y aplica esto sobre cualquier proyecto Laravel.

Iniciar curso
Imagen para el curso Laravel y Android

Laravel y Android

Curso intensivo. Incluye el desarrollo de una API, su consumo, y autenticación vía JWT. También vemos Kotlin desde 0.

Iniciar curso
Imagen para el curso Aprende Vue 3

Aprende Vue 3

Nuevo curso! Aprende Vite, Pinia, Vuetify, Vue Router y TypeScript. Desarrolla un eCommerce desde cero.

Iniciar curso

Espera un momento ...

¿Te gustaría llevar mi curso de Laravel, gratis?

Sólo debes ingresar tus datos: