¿Cuál es la diferencia entre Encryption, Encoding, Hashing y Obfuscation?
Tiempo de lectura: 3.15 minutos
Lo que encontrarás en este artículo
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:
- Encoding (codificación)
- Encryption (encriptación)
- Hashing
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.
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.
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.