15
Mar
2012

MAC: autenticación de mensajes

La criptografía permite asegurar la confidencialidad de un mensaje pero no su integridad. Un atacante podría modificar (“tamperear”) un mensaje cifrado en medio de la comunicación y el receptor no tendría elementos para determinar si esto ocurrió.

Las técnicas de encadenamiento de bloques (block-chaining), utilizadas habitualmente en la criptografía, hacen que la tarea de modificar un mensaje no sea tan fácil. Si todos los bloques se encuentran encadenados y dependen de los anteriores, probablemente al realizar una modificación estemos introduciendo basura que no puede ser descifrada por el receptor. Sin embargo, en determinadas condiciones puede construirse un mensaje “válido” para el receptor a partir, por ejemplo, de mensajes cifrados -previamente interceptados- que guarden una estructura común.

MAC (Message Authentication Code) es una técnica destinada a autenticar mensajes y verificar, por lo tanto, su integridad. Dado un mensaje (m) y una clave (K), llamamos tag (T) al resultado de aplicarle al par mensaje-clave la función MAC. Para ser más claros: T = MAC(K, m).

Al enviar el mensaje al receptor adjuntamos T. El receptor, quien conoce previamente a K, realiza el mismo cálculo y comprueba de esa forma si el mensaje es auténtico. Un atacante que intercepte la comunicación no sabría, al modificar el mensaje, cómo generar un T válido.

Todo mensaje distinto tendrá un T distinto. Al igual que ocurre con las funciones de hash, el conjunto imagen (T) es finito y esto hace que la función no sea inyectiva. Si no fuera posible generar colisiones intencionadas, no se sabría qué bits agregar para hacer pasar un mensaje modificado por uno auténtico (dado un T conocido).

Según Bruce Schenier, en su libro Cryptography Engineering:

An ideal MAC function is a random mapping from all possible inputs to n-bits outputs.

En los próximos artículos veremos las implementaciones más comunes de MAC, como por ejemplo CBC-MAC, HMAC y GMAC.

11
Mar
2012

DIA – Editor de Diagramas OpenSource

dia - editor de diagramas opensource

Quizás muchos ya lo conozcan pero el otro día tuve que realizar un diagrama de Entidad-Relación y acudí a este editor visual de diagramas: DIA. Cumple el mismo rol que Microsoft Visio pero se trata de una aplicación open source, desarrollada en el marco del proyecto GNOME. Podemos dibujar diagramas de red, diagramas UML, diagramas de Entidad-Relación (MER), diagramas de circuitos eléctricos, etc.

Es muy fácil de usar, ofrece un abanico amplio de diagramas (hay unas 35 plantillas aproximadamente con todo tipo de elementos) y brinda las comodidades básicas para edición de texto, incorporación de imágenes y conexión de elementos mediante distintos tipos de líneas y flechas.

Los diagramas pueden exportarse a múltiples formatos: PNG, PDF, SVG, etc.

Se encuentra disponible para múltiples plataformas: Linux, OS X y Windows. Probé instalarlo desde los repositorios de Ubuntu 10.10 y compilarlo bajando el source del sitio oficial -hay que instalar algunas dependencias pero se encuentran todas en el repositorio oficial de Ubuntu-.


Leer el resto del artículo »

10
Mar
2012

Diseño de un mecanismo de autenticación – Parte I

En esta serie de artículos quiero presentar un mecanismo de autenticación web sencillo, de la familia challenge-response, que diseñe para el sitio Live! -la idea no es original obviamente-.

Lo más típico en la autenticación web es que el sitio pregunte al usuario por la contraseña. El usuario la ingresa y en el servidor se calcula su digest. Este digest se compara contra el digest guardado en la base de datos y si son iguales, la autenticación es válida.

Este mecanismo es sencillo y no almacena la contraseña en el servidor. Pero puede ser peligroso: la contraseña viaja desde el cliente al servidor en texto plano. Cualquiera que pueda interceptar uno de estos paquetes (a nivel de Internet o de la red interna), podría visualizarla. ¿Puede ser útil este tipo de autenticación? Sí, si se utiliza el protocolo HTTPs (SSL) en la comunicación cliente-servidor.

Supongamos que, habiendo evaluado el impacto y riesgo, llegamos a la conclusión de que HTTPs no es una opción. Lo que debemos hacer es implementar un mecanismo de autenticación que reduzca a un atacante sus posibilidades de éxito. Por ejemplo, que aún sniffeando y registrando todos los paquetes de una conexión, no pueda autenticarse.

autenticacion web segura


Leer el resto del artículo »

24
Feb
2012

Live! Blogs, antes de lo esperado

Live Blogs

Como comentaba en el artículo anterior (Live! 2.0), planificaba para el año que viene implementar el módulo Live! Blogs. Con bastantes horas de programación en estos días, logré terminarlo antes de lo esperado 🙂

Funciona de la siguiente manera:

– Cada vez que se escribe/edita/elimina un artículo o comentario en uno de los blogs WordPress asociados, se envía una notificación mediante cURL HTTP GET a Live!. Al recibir esta notificación, Live! actualiza la información del artículo o comentario en base a un canal XML con el blog (era un RSS al que le modifiqué completamente el esquema para expresar la información de interés).

– Al escribirse un comentario en Live! Blogs, se envía una notificación mediante cURL HTTP POST con los datos del comentario al blog WordPress asociado para que se publique. Si no se encuentran errores, Live! Blogs recarga nuevamente los comentarios del artículo.

– Live! Blogs, de esta manera, guarda una réplica sincronizada (en tiempo real) de los artículos y comentarios de los blogs WordPress asociados. Esto permite que en la mayoría de las situaciones -lecturas- se obtenga un buen tiempo de respuesta.

Live! utiliza la clase SimpleXML de php para parsear el archivo XML.

Del lado de WordPress, armé un plugin sencillito y modifiqué algunos archivos del core para aplicar el filtro en los lugares necesarios.

Live! Blogs puede mostrar todos los artículos juntos o filtrar por blog.

18
Feb
2012

Live! 2.0

Live martin.com.uy

Hago un paréntesis en las publicaciones habituales porque quiero presentarles Live! 2.0 (http://martin.com.uy/live). Es una versión renovada de este mini-sitio personal, que utilizo principalmente para subir imágenes y publicar notas.

Fue programado desde cero con Symfony 2 (php) y jQuery (javascript + ajax). Utilizo también el ORM Doctrine, el motor de plantillas Twig y Swiftmailer -para el envío de mails de notificación-.

Tenía desde hace tiempo en el debe aprender esas tecnologías y la verdad que me dejaron muy satisfecho.

El sitio fue probado en Firefox, Chrome y Safari. En Internet Expĺorer ni siquiera me molesté en probarlo…

Son bienvenidos los comentarios y sugerencias! 🙂

15
Dec
2011

Okteta: el mejor editor hexadecimal

okteta editor hexadecimal

En el día de hoy, fastidiado por la anti-usabilidad y anti-funcionalidad del editor hexadecimal hexedit, me puse a buscar un remplazo y me encontré esta pieza de software maravillosa llamada Okteta.

Okteta está desarrollado dentro del proyecto KDE. Por lo tanto, para instalarlo puede requerirse una cantidad grande de librerías: unos 220Mb apróx. si no se tienen instaladas las librerías de KDE y unos 15Mb teniendo instaladas las librerías básicas. Yo lo instalé en Linux; desconozco si en KDE para Windows también funciona.

Se puede editar el archivo con comodidad, insertar/editar/eliminar bytes, insertar texto, cambiar la codificación de los caracteres a nivel de visualización, visualizar los valores en binario/octal/decimal en lugar de hexa, insertar marcadores (comentarios) por byte, realizar operaciones a nivel de bits, etc.

La última versión estable es la 0.5. Se encuentra licenciado bajo la licencia GPL versión 2.


Leer el resto del artículo »

13
Dec
2011

Mi propia implementación de SHA1

Quiero presentarles en este artículo mi propia implementación del algoritmo de hashing SHA1. Me basé en el estándar Secure Hash Standard (FIPS 180-1) de la Federal Information Processing Standards Publications (FIPS) (link).

El trabajo fue realizado con fines educativos únicamente. Desaconsejo su utilización en entornos de producción. Busqué además la claridad del código en lugar de la eficiencia en las operaciones y estructuras de datos.

Para el desarrollo utilicé el framework Qt y el lenguaje de programación C++. Si desean recompilar o ejecutar el binario, deberán instalar la SDK o las librerías de Qt respectivamente.

Los comandos de ejecución son los siguientes:

Calcular el hash a la cadena “abcdefg”
./Sha1 abcdefg

Calcular el hash a la cadena por defecto (“abc”)
./Sha1

Para calcular el hash a una cadena binaria arbitraria (no tiene por qué ser múltiplo de 8), se debe modificar el src -en el código hay comentarios para esto- y recompilar.


Leer el resto del artículo »

6
Dec
2011

Criptografía: IV + demo en OpenSSL

Como mencionamos en el artículo anterior, el IV o Initialization Vector es un vector de bits que permite aplicar una operación XOR con el primer bloque de largo fijo del mensaje a cifrar. De esta forma, si utilizamos como regla no repetir el IV entre distintos mensajes -para una misma clave-, por más que se repita el primer bloque a cifrar a nivel de plaintext, el ciphertext será diferente.

Propongo visualizar los conceptos explicados hasta el momento haciendo unas pruebas simples con OpenSSL.

Tenemos un archivo con el siguiente contenido:

root@martin-laptop:~/ciphers# cat archivo
plain text, este es un texto de pruebas que debe ocupar mas 128 bits
root@martin-laptop:~/ciphers# hexdump archivo
0000000 6c70 6961 206e 6574 7478 202c 7365 6574
0000010 6520 2073 6e75 7420 7865 6f74 6420 2065
0000020 7270 6575 6162 2073 7571 2065 6564 6562
0000030 6f20 7563 6170 2072 616d 2073 3231 2038
0000040 6962 7374 000a
0000045

Como podemos ver, el archivo contiene exactamente 70 bytes = 560 bits. Esto es igual a 4 bloques enteros de 128 bits (4 * 128 = 512 bits) + 48 bits más.


Leer el resto del artículo »

5
Dec
2011

Criptografía: Padding + ECB + CBC

Para el cifrado de un mensaje, se divide a nivel binario el mensaje en bloques de largo fijo. Este largo puede ser por ejemplo de 128 bits (4 bytes) y depende de cada algoritmo. Se llama block cipher al algoritmo que dado un bloque de largo fijo y una clave, lo transforma en un bloque cifrado (ciphertext).

Los mensajes que se desean cifrar no necesariamente cumplen con la propiedad de tener un largo múltiplo del largo fijo del bloque. Padding es una técnica que permite expandir el último bloque del mensaje hasta lograr el tamaño requerido. Esta operación debe poder ser revertida por el destinatario del mensaje. En otras palabras, el destinatario debe poder determinar con precisión en el último bloque cuántos bits corresponden al mensaje real y cuántos bits fueron agregados por la técnica de padding.

Existen múltiples técnicas de padding. Bruce Schenier, en su libro Cryptography Engineering, menciona dos:

  • Agregar al final del mensaje un byte con el valor 128 y luego agregar tantos 0’s como haga falta para alcanzar el largo del bloque de largo fijo.
  • Determinar el número de bytes que se requieren de padding. Supongamos que este número es n. Completar el mensaje con n bytes de valor n.

Cualquier técnica es válida mientras permita completar el mensaje hasta el largo requerido y el receptor pueda obtener con exactitud el mensaje original -sin bits extra y sin bits faltantes-.


Leer el resto del artículo »

28
Jul
2011

Plan de Continuidad del Negocio y Análisis de Impacto

A continuación, quiero presentar un abordaje posible para el Análisis de Impacto en el Negocio (Business Impact Analysis) y la elaboración de Planes de Continuidad del Negocio (BCP):

1. Identificación de los procesos de la organización.

2. Análisis del impacto que tiene la suspensión de cada proceso desde la perspectiva económica, productiva, competitiva, de imagen o reputación, contractual y legal. Determinación de la criticidad de los procesos.

3. Definición del tiempo máximo que es tolerable la suspensión total o parcial de un proceso.

4. Identificación de los recursos físicos, tecnológicos y humanos que involucra cada proceso.

5. Identificación de las amenazas a las que están sujetos estos recursos.

6. Análisis de la probabilidad de ocurrencia de estas amenazas.

7. Análisis del impacto que puede tener la amenaza en los recursos y la no-disponibilidad de los recursos en los procesos. Por ejemplo: if a tornado were to hit and affect 65 percent of the facility, the company could be at risk of losing computing capabilities for up to 72 hours, power supply for up to 24 hours, and a full stop of operations for 76 hours, which would equate to a loss of $125,000 each day. (McGraw – Hill)

8. Desarrollo de planes de continuidad que para cada amenaza, planteen una alternativa para continuar el proceso según las siguientes consideraciones:

  • el proceso se continúa dentro del tiempo máximo tolerable de suspensión,
  • el proceso se continúa independientemente de los recursos afectados, y
  • el riesgo, dado por la probabilidad de ocurrencia de una amenaza y el impacto en los procesos de la organización, es una guía para medir los esfuerzos destinados a la continuidad.