viernes, 7 de diciembre de 2012

enscript - Convertir archivos de texto a formato PostScript, HTML, RTF, y ANSI

Acabo de encontrar esta joyita en Linux: el paquete enscript. Como el título de este post lo dice, permite convertir archivos de texto plano a varios formatos, incluso proveyendo resaltado de sintaxis en el resultado para un montón de lenguajes de programación.
En los siguientes dos ejemplos voy a exportar 1) un script del Bash, y 2) un programa sencillo del tipo "Hola mundo!" escrito en Java, a correspondientes archivos bash.html y java.html.

holamundo.java:


Ahora ejecuto el siguiente comando desde la terminal:
Y muestro el resultado en el navegador:


servicios.sh:

Ahora ejecuto el siguiente comando desde la terminal:
Quedando:


Primeros pasos - VBA en Excel 2007 (Primera parte)

Mi jefe ayer me encargó atender un requerimiento proveniente de una planta ubicada en el Reino Unido. Se trata de una plantilla de Excel 2007 que incluye macros escritas en VBA y a la que se le debe incorporar un form que permita manipular datos de manera intuitiva y automática.

En realidad, sé algo de Visual Basic, pero nunca incorporé VBA a mis planillas de cálculo, más allá de un par de macros para facilitar ediciones de formato u otras cosas simples. También he hecho algo de scripting con VBScript, así que... ¿qué tan difícil puede ser? No tanto. Esto es lo que me di maña en un rato:

Un botoncito (un control ActiveX) que inicia el form principal:


Luego de hacer clic en "OK", se abre el menú:


Donde en el primer textbox ingreso un texto cualquiera, en el segundo la celda donde deseo escribirlo, y finalmente la hoja en la que voy a guardarlo:


Resultado:


Otro ejemplo:


Ahora, el código y los comentarios:

En primer lugar, el código del control ActiveX (el botón se llama "Saludo") que inicializa el form principal:

El resto del código:

miércoles, 5 de diciembre de 2012

Firmas y certificados digitales

Una firma digital es un esquema matemático que se utiliza para demostrar la autenticidad de un mensaje o documento digital. Una firma digital válida le da al receptor la garantía que el mensaje ha sido creado por un emisor conocido, y que no ha sido alterado en el camino. Las firmas digitales se emplean por lo general en la distribución de software, en transacciones financieras, y en otros casos en los que sea importante detectar falsificaciones o manipulación indebida. (Resumen traducido de Digital Signature, Wikipedia).

Un certificado digital (también conocido como certificado de identidad) es un documento electrónico que utiliza una firma digital para vincular una clave pública con una identidad determinada - tal como el nombre de una persona o de una organización, sus direcciones, etc. Este certificado también puede usarse para verificar que una clave pública le pertenece a un individuo específico. (Resumen traducido de Public key certificate, Wikipedia)

Generando una firma digital mediante DSA (Digital Signature Algorithm):

Primera fase: Elección de los parámetros del algoritmo, los cuales pueden ser compartidos por varios usuarios del sistema.
(Nota: /dev/random es un archivo especial que se encuentra presente en sistemas operativos basados en Unix y se emplea como un generador de números aleatorios mediante el acceso a "ruido ambiental" recogido de drivers de dispositivos y otras fuentes).


Segunda fase: Cálculo de clave pública y privada para un usuario determinado.


Creo el archivo "archivo.sha1" con el hash sha1 de "archivo" (por eso filtro con awk la primer columna a fin de utilizar el hash propiamente dicho, ver las diferencias en las imágenes siguientes. Con print $0 muestro todo el contenido del archivo sin filtrar, pero a mí me interesa únicamente el hash, por ese motivo empleo print $1). Para esto se puede utilizar tanto el comando sha1sum como openssl dgst -sha -sha1.



Creo la firma digital del hash (archivo.sha1) correspondiente al archivo "archivo", con mi clave privada. Luego verifico con mi clave pública que la firma "firma" es la que corresponde al hash que contiene archivo.sha1:


De esta manera, si se pudo verificar la firma con la clave pública del emisor, significa que éste último es el único que puede haberla creado a partir de su clave pública.

Por último, en este link hay un excelente recurso para comprender los conceptos de clave pública y privada, y firmas / certificados digitales.

lunes, 3 de diciembre de 2012

Funciones hash

Una función hash genera una cadena de caracteres a partir de un mensaje o de un archivo para determinar si el mismo ha sido modificado en la cadena de transmisión (de ser así, el resultado de la función cambia) y de esa manera asegurar su integridad y autenticidad.

Para evitar la posibilidad de que tanto el mensaje (archivo) como su hash correspondiente sean modificados en el camino, el emisor puede utilizar un cifrador asimétrico para encriptar el hash con una clave pública. El problema con esto es que cualquiera que tenga la clave pública puede interceptar el mensaje con su hash, modificarlos, y enviarlos nuevamente.

La manera de evitar este último incoveniente es combinar un algoritmo simétrico con uno asimétrico, generando un secreto compartido (clave simétrica) entre emisor y receptor, el cual si bien no va a ser usado para encriptar, el emisor va a concatenar esta clave al contenido del mensaje original, y a eso le va a calcular el hash, para luego encriptar este último con la clave pública. Sin embargo, lo que se envía es el mensaje original sin la clave concatenada, y el hash encriptado. Cuando se recibe, se descifra el hash enviado, se concatena el mensaje con el secreto compartido, se le calcula el hash en destino y se calcula con el que se recibió - la igualdad de ambos asegura la autenticidad y la integridad de la transmisión.

En resumen:
  1. Se genera un secreto compartido entre emisor y receptor.
  2. El emisor concatena el mensaje original junto con el secreto compartido, y calcula el hash del resultado.
  3. Se envía el mensaje original y el hash obtenido en el punto 2 de forma separada.
  4. En el destino, se concatena el mensaje recibido y el secreto compartido.
  5. Se calcula el hash del resultado obtenido en el punto 4.
  6. Se compara el hash del punto 2 con el del punto 5.
MD5 utiliza hashes de 128 bits. Se considera que, dadas las capacidades de cálculo actuales, puede llegar a ser vulnerable o que existan dos archivos cuyos hashes sean idénticos.
SHA-1 emplea hashes de 160 bits, y el SHA-512 de 512 bits.

Ejemplos:
  • Creo el archivo llamado "archivo" y le agrego la cadena "Yo uso CentOS :)".
  • Calculo el hash MD5 de archivo.
  • Le agrego un espacio (" ") a "archivo".
  • Vuelvo a calcular el hash MD5 y comparo los hashes obtenidos.
  • Creo el archivo "archivo" con el texto original ("Yo uso CentOS :)") y calculo los hashes SHA-1 (160 bits) y SHA-2 512 de 512 bits.