En mis años como instructor he tenido la dicha de tratar con muchos estudiantes de distintos niveles, desde iniciados hasta estudiantes con experiencia.
Igualmente esto varía de área de interés, estudiantes que quieren ser desarrolladores, administradores de sistema y claro, ciberseguridad.
En nuestra área de informática hay muchos conceptos y se siguen agregando, esto principalmente porque es el área que más se ha desarrollado en los últimos 60 años.
Esta es la motivación principal por la que escribo este artículo, abordar estos conceptos que me ha tocado aclarar en el pasado.
Espero que sea de mucha ayuda.
1. Encoding: El Arte de Representar Datos
El Origen del Encoding
Para entender qué es el encoding, primero debemos remontarnos a la necesidad original: la comunicación entre diferentes sistemas y plataformas. En los primeros días de la computación, cada fabricante definía sus propias maneras de representar caracteres (letras, dígitos, símbolos). Fue un caos. Imagina IBM con EBCDIC, DEC con sus interpretaciones, y otros gigantes definiendo estándares propios, lo que generaba inconsistencias al tratar de transferir datos de un lado a otro.
Para solucionar ese problema, surgió la idea de unificar criterios y se empezó a trabajar en estándares como ASCII. Con el paso del tiempo, el mundo se volvió más global y necesitábamos representar más idiomas, surgieron ampliaciones como ISO-8859-1 (Latin-1), UTF-8, etc. Así nació el encoding como una forma de mapear cada símbolo en código binario y que cualquier sistema interpretara esos bytes de la misma manera.
¿Qué es Encoding en la Práctica?
El encoding (o codificación) es un mecanismo de representación de la información para que sea legible y manipulable por diversos sistemas y aplicaciones. Ejemplos de codificación incluyen:
- ASCII y UTF-8: para textos e idiomas en la terminal de Linux.
- Base64: muy usado para transferir datos binarios a través de canales que solo aceptan texto (por ejemplo, en correos electrónicos o APIs).
En Linux, por ejemplo, es muy común toparse con la necesidad de convertir archivos o cadenas a Base64. Un ejemplo rápido:
echo "Hola mundo" | base64
SG9sYSBtdW5kbw==
Este output es la representación Base64 de “Hola mundo”. Sin embargo, es importante recalcar que esto NO protege tus datos ni los oculta de forma segura, solo los hace transportables o más manejables en ciertos contextos.
A primera vista, encoding (codificación) podría parecer irrelevante en el mundo de la ciberseguridad si consideramos que no protege la información de manera confidencial. Sin embargo, su llegada y adopción en ciberseguridad tiene razones muy concretas:
- Transporte de datos a través de canales restringidos
- Muchas veces nos encontramos con sistemas o protocolos (por ejemplo, correos electrónicos o HTTP) que funcionan mejor —o únicamente— con texto plano. El encoding permite convertir datos binarios (archivos, scripts, payloads) en una representación textual que no se corrompa ni se bloquee en tránsito.
- En la práctica, cuando se envían archivos adjuntos en un correo o se incluyen imágenes en un JSON, se utiliza Base64 para garantizar compatibilidad.
- Evitar problemas de compatibilidad y parseo
- En entornos de ciberseguridad (por ejemplo, en el intercambio de indicators of compromise o en la automatización de scripts de pentesting), los datos pueden contener bytes “extraños” o caracteres especiales.
- Con Base64 (u otros encodings), se asegura que cualquier herramienta de línea de comandos, SIEM o plataforma de seguridad pueda manejar el contenido sin romper el formato.
- Obfuscación (limitada pero útil en ciertos contextos)
- Aunque no sea una encriptación, encodear un script malicioso en Base64 puede ayudar a un atacante (o a un tester en un entorno controlado) a saltarse ciertas protecciones superficiales, como filtros que bloquean patrones de texto en claro.
- Los defensores también pueden usar la codificación para almacenar cadenas y evitar su detección involuntaria por herramientas que hagan búsqueda de patrones, o para prevenir inyecciones al transferir información delicada (aunque luego se deberá encriptar si se requiere confidencialidad).
- Facilitar la automatización
- En flujos de DevSecOps, las pipelínes de CI/CD (Continuous Integration/Continuous Deployment) a veces necesitan mover objetos binarios (archivos de configuración, binarios, logs) a través de APIs. Emplear Base64 simplifica la transición y hace más robusta la comunicación entre servicios.
- Muchas librerías de seguridad y utilidades (por ejemplo, Metasploit, Nmap, scripts de reconocimiento, etc.) tienen opciones para emitir o aceptar datos en un formato encodeado para su posterior procesamiento.
- Registro y auditoría
- En ocasiones, los analistas de seguridad necesitan registrar datos binarios en archivos de log (por ejemplo, cuando se captura un payload sospechoso). Si se guarda en binario, esos logs pueden resultar ilegibles o corromper otros datos. Encodear en Base64 o HEX facilita su almacenamiento, revisión y análisis forense.
¿Por qué es útil si “no encripta”?
- Porque cumple otro rol: el encoding no busca proteger la confidencialidad, sino facilitar la transferencia, almacenamiento y reconocimiento de datos.
- En ciberseguridad, a menudo lo importante no es solo cifrar, sino compartir y mover información (con o sin cifrado). Ahí es donde el encoding brilla:
- Se integra en protocolos de red.
- Trabaja bien con herramientas que solo procesan texto.
- Simplifica la vida de analistas e ingenieros al mantener la integridad de la información transferida.
Si bien el encoding no ofrece cifrado ni privacidad real, su capacidad para convertir datos binarios en caracteres ASCII sigue siendo fundamental en flujos de seguridad (exchange de indicadores, envío seguro —a través de protocolos encriptados— de payloads, registros forenses, etc.). Es la base para una comunicación estandarizada y fiable en un entorno donde la compatibilidad de formatos puede resultar tan crítica como la propia confidencialidad.
2. Hashing: La Huella Digital de los Datos
Ahora que tenemos claro el propósito del encoding, pasamos a hashing. Si bien alguien podría confundirlo con algún tipo de cifrado, no lo es. Hashing es el proceso de tomar un conjunto de datos (un archivo, un mensaje, una contraseña) y generar un string alfanumérico de longitud fija, que sirve como “huella digital” de esa información.
¿Por qué es Importante en Ciberseguridad?
En ciberseguridad, el hashing se emplea para:
- Verificar Integridad: Si se altera un solo bit del contenido original, el hash cambia drásticamente.
- Almacenar Contraseñas: En lugar de guardar contraseñas en texto plano, se almacena el hash de las mismas (idealmente con sal y usando algoritmos seguros).
¿Para qué se usa?
Un hash es el resultado de aplicar una función matemática (por ejemplo, SHA-256, MD5, SHA-512, etc.) a un conjunto de datos (un archivo, un texto, una imagen ISO) para generar una “huella digital” única. Algunas características clave:
- Identificador único:
- Un archivo grande y pesado (megabytes o gigabytes) puede resumirse en un hash de longitud fija (por ejemplo, 64 caracteres hex en el caso de SHA-256).
- Cualquier cambio mínimo (aunque sea un bit) en el archivo hace que el hash resultante sea muy distinto.
- Unidireccional:
- Es sencillo calcular el hash de un archivo, pero es prácticamente imposible “revertir” el hash para volver a obtener el archivo original.
- Esta propiedad se usa en seguridad para almacenar contraseñas y verificar integridad.
- Verificación de Integridad:
- Cuando un proveedor (de software, distribuciones Linux, etc.) publica una imagen ISO, normalmente también publica su hash oficial.
- El usuario que descarga la ISO puede calcular el hash localmente. Si coincide con el oficial, hay altas probabilidades de que el archivo no haya sido alterado.
Caso Real: Linux Mint y la ISO Comprometida
¿Qué pasó con Linux Mint?
En febrero de 2016, el sitio web de Linux Mint fue hackeado. Los atacantes sustituyeron la ISO oficial de Linux Mint por una versión modificada que contenía una puerta trasera (backdoor). Esto significaba que cualquiera que descargara esa ISO desde el enlace comprometido y la instalara podía exponer su sistema a los atacantes.
¿Cómo se descubrió?
El equipo de Linux Mint se dio cuenta de que algo estaba mal al:
- Detectar actividad sospechosa en su sitio web (los enlaces de descarga redirigían a un servidor desconocido).
- Notar que los hashes de las ISOs descargadas por algunos usuarios no coincidían con los hashes oficiales publicados.
En otras palabras, algunos usuarios que bajaban la ISO y comprobaban el hash con la referencia oficial se dieron cuenta de que no encajaba. Eso levantó la bandera roja y se confirmó que la ISO había sido modificada.
¿Cómo verificar un Hash en Linux?
En sistemas Linux, las herramientas más comunes para verificar hashes son:
- md5sum (obsoleto para fines críticos de seguridad, pero aún se usa para una verificación rápida).
- sha1sum, sha256sum, sha512sum (recomendadas para mayor seguridad).
Por ejemplo, si descargas la ISO de una distribución y quieres comprobar su hash SHA-256, podrías hacer lo siguiente:
# 1. Descarga la ISO (por ejemplo, linuxmint.iso).
# 2. Descarga o copia el valor del hash oficial publicado por la distro (sha256sum.txt).
# Luego, desde tu terminal:
sha256sum linuxmint.iso
El comando arrojará algo como:
d1c6f21b2c4f63a5a15fd6eca09f1a0f134b848e226999b967c85ccbd88b4eaa linuxmint.iso
Comparas esta cadena hexadecimal (d1c6f2...
) con la publicada por los desarrolladores.
- Si coinciden: Es altamente probable que la ISO que descargaste sea la misma que ellos distribuyen (sin modificaciones).
- Si difiere: Tu archivo pudo corromperse durante la descarga, o peor, podría haber sido alterado maliciosamente.
Resumiendo
El hash no es una herramienta de cifrado ni de encoding, sino de verificación de integridad. Gracias al uso de hashes, la comunidad y los desarrolladores pudieron descubrir ataques como el que sufrió Linux Mint (entre muchos otros casos).
Para estudiantes que se inician en ciberseguridad o que simplemente desean proteger su equipo y garantizar la autenticidad del software que instalan, comprobar los hashes de los archivos descargados (sobre todo de distribuciones Linux, firmware, instaladores de software, etc.) es un paso fundamental. Te ahorras sorpresas desagradables y te aseguras de que estás usando exactamente el contenido que el desarrollador o la comunidad publicaron y no una versión manipulada.
3. Encriptación: Protegiendo el Contenido
La encriptación (o cifrado) es el paso definitivo cuando hablamos de confidencialidad. A diferencia del encoding y del hashing, la encriptación convierte la información en un formato ilegible con el fin de protegerla de accesos no autorizados. Sin la clave correcta (o la contraseña correspondiente), no es posible descifrar el contenido y leerlo.
Existen dos grandes enfoques de cifrado:
- Cifrado Simétrico: Usa la misma clave para cifrar y descifrar. Ejemplo: AES.
- Cifrado Asimétrico: Usa un par de claves (pública y privada). Ejemplo: RSA.
Ejemplos en Linux
Las herramientas clásicas para cifrado en Linux incluyen GnuPG (GPG) y OpenSSL. Por ejemplo, para cifrar un archivo con GPG:
gpg -c archivo.txt
Este comando te pedirá una passphrase y generará un archivo.txt.gpg
. Para descifrarlo, ejecutas:
gpg -d archivo.txt.gpg
El mecanismo utiliza cifrado simétrico. Con GPG también es posible emplear cifrado asimétrico, intercambiando claves públicas y privadas.
Diferencias Clave a Recordar
- Encoding:
- Propósito: representación y portabilidad.
- No es seguro por sí mismo.
- Ejemplo: Base64, ASCII, UTF-8.
- Hashing:
- Propósito: integridad y verificación.
- Es unidireccional: no se puede “des-hash” un valor para recuperar la data original.
- Ejemplo: SHA-256, MD5, bcrypt.
- Encriptación:
- Propósito: confidencialidad.
- Requiere una clave para revertir el proceso (descifrar).
- Ejemplo: AES, RSA, GPG.
Resumiendo
Tanto en el mundo Linux como en ciberseguridad, y aun en la ingeniería de software, es crucial no mezclar estos conceptos. Aunque a veces la gente los usa indistintamente en una conversación informal, cada uno tiene propósitos y mecanismos distintos:
- El encoding se trata de transformar datos para que sean compatibles entre sistemas (ej. Base64 para emails).
- El hashing se utiliza para asegurar la integridad y autenticidad, generando “huellas digitales”.
- La encriptación se encarga de proteger la confidencialidad de la información, haciendo que solo quien posea la clave pueda descifrar y leer el contenido original.
Saber diferenciar estas tecnologías es fundamental para armar una estrategia de seguridad sólida y eficiente, desde la configuración de servidores y servicios en la nube hasta la manipulación local de archivos en tu distribución de Linux favorita. Cada una tiene su lugar en la caja de herramientas y, usadas correctamente, pueden robustecer enormemente la postura de seguridad y la fiabilidad de tus sistemas.