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.


viernes, 30 de noviembre de 2012

Instalación de CentOS 6.3 sobre Virtual Box

Ayer leí (por ahí...) que Debian y CentOS se "sacan chispas" por llevar la delantera en lo que a servidores GNU/Linux se refiere, a nivel mundial. En julio de 2010, CentOS sobrepasó a Debian al alcanzar casi el 30% de los servidores GNU/Linux, pero Debian volvió a ponerse en punta a principios de este año.
De una u otra manera, está bien claro que estas dos distribuciones mantienen una posición predominante en este rubro de TI.
Como yo ya instalé un server Debian, ahora quise probar con CentOS, una distribución basada en Red Hat (la razón principal es que las certificaciones de Red Hat son las más prestigiosas en el mundo).
Para probar, bajé la imagen del LiveDVD desde la página oficial, y lo instalé sobre Virtual Box.
A continuación, las capturas de pantalla de la instalación junto con comentarios.

Booteando desde el LiveDVD (imagen .iso):

Menú inicial: Elegí la opción "Install (Text Mode) para iniciar la instalación sin entorno gráfico (sólo línea de comandos):
  

Esta es la pantalla inicial de la instalación ("Bienvenidos a CentOS"):


Luego sigue la pantalla de selección de idioma para la instalación:



Selección del modelo de teclado a usar durante la instalación:



Zona horaria:




Contraseña del superusuario root:



Opciones de instalación y particionamiento (yo elegí usar el disco entero, "Use entire drive"):



Ventana de confirmación antes de guardar los cambios al disco:

 

Comenzando la instalación:




¡Instalación finalizada!:


Antes de reiniciar, hay que borrar la imagen .iso de donde estaba guardada para que no vuelva a bootear el LiveDVD (sería el equivalente a quitar el DVD de la lectora luego de finalizar la instalación, para evitar comenzar con el proceso otra vez).

Luego, muestra el grub con las opciones de inicio:







Configuración de autenticación:


Habilitamos el firewall:



Ahora elegimos la distribución permanente del teclado (antes lo habíamos hecho para el proceso de instalación):


Y habilitamos los servicios de red (con las flechas del teclado nos desplazamos hacia abajo y hacia arriba, con la barra espaciadora seleccionamos o deseleccionamos cada servicio, y con el tabulador salimos de la lista hacia "OK" o "Cancel"):


Listo el pollo y pelada la gallina, ahora sí iniciamos pipí cucú:


Chusmeamos un poco el manpage de yum, el gestor de paquetes (man yum):


finalmente, como no quiero que mi equipo se llame "localhost", sigo las instrucciones de la ayuda oficial de Red Hat para cambiarle el nombre a "centos", lo cual puede hacerse de dos maneras:

1) Dinámicamente (los cambios se pierden al reiniciar) a través del comando hostname, seguido del nuevo nombre de host.

2) Persistente (los cambios permanecen), editando el archivo /etc/sysconfig/network.

Antes:

Después:

Ya iremos retocando la instalación, pero eso será tema para otro post ;).

jueves, 29 de noviembre de 2012

Conceptos de criptografía (2da parte)

Cifradores asimétricos: Permiten encriptar un mensaje utilizando una clave y descifrarlo utilizando otra (claves pública y privada, respectivamente). En otras palabras, si alguien quiere enviarme un mensaje cifrado con mi clave pública (la cual puede distribuirse libremente), solamente yo voy a poder desencriptarlo utilizando mi clave privada (que es estrictamente personal y no debe compartirse bajo ningún punto de vista).
La generación de estas claves se basa en cálculos de números primos y logaritmos.

El algoritmo RSA es el más utilizado en el cifrado asimétrico (ver este link para una descripción completa de su funcionamiento con ejemplos).

Genero mi clave privada, obtengo la clave pública a partir de la misma, y la muestro:

Fig. 1: Generación de claves


Ahora voy a probar en encriptar un mensaje con esta clave pública (pruebo desde una máquina virtual simulando un emisor, que también podía ser otro usuario del mismo equipo)...

Fig. 2: Cifrado de mensajes

  para luego descifrarlo utilizando mi clave privada: 

Fig. 3: Desencriptar mensajes ("Yo uso Debian :)" es el contenido de "archivo", que me acabo de dar cuenta que no salió en la captura de pantalla correspondiente a la Figura 2)

Para tener en cuenta: al compartir la clave pública lo conveniente es distribuir el archivo pub.pem directamente en vez de "copiar y pegar" sus contenidos en un archivo vacío y darle el mismo nombre (al principio probé de esta última manera, pero al parecer por una cuestión de formato me daba el error "Unable to load Public Key").

martes, 27 de noviembre de 2012

Conceptos de criptografía (1era parte)

La criptografía actualmente se encarga del estudio de los algoritmos, protocolos y sistemas que se utilizan para dotar de seguridad a las comunicaciones, a la información y a las entidades que se comunican (José Pastor Franco, Miguel Ángel Sarasa López, José Luis Salazar Riaño,"Criptografía digital: fundamentos y aplicaciones",Ed. Prensas Universitarias de Zaragoza, 1998), permitiendo que los mensajes puedan ser leídos (descifrados) únicamente por el emisor de los mismos y el (o los) destinatario(s) deseado(s), pudiendo estos últimos tener la seguridad de que dichos mensajes proceden de quienes dicen ser los emisores, y que no han sido alterados en el camino. De esta manera, las palabras claves para la criptografía son privacidad, integridad, y autenticidad.




Cifradores simétricos: encriptan y desencriptan la información utilizando la misma clave.

Por ejemplo, digamos que se quiere enviar el texto "gabriel" como mensaje cifrado, utilizando la cadena "0123" como clave.



Caracteres ASCII
Hex
gabriel (código ASCII tomado de aquí) 67  61  62  72  69  65  6C
0123012 (la clave se repite secuencialmente hasta abarcar todos
los caracteres que se desean encriptar)
30  31  32  33  30  31  32
Algoritmo de cifrado: OR Exclusivo (Mensaje cifrado) 57  50  50  41  59  54  5E 
Tabla 1: Encriptación del mensaje


Caracteres ASCII
Hex
Mensaje cifrado 57  50  50  41  59  54  5E
0123012 (la clave se repite secuencialmente hasta abarcar todos
los caracteres que se desean encriptar)
30  31  32  33  30  31  32
Algoritmo de descifrado: OR Exclusivo (Mensaje original) 67  61  62  72  69  65  6C
Tabla 2: Desencriptación del mensaje

Ejemplo 1: Encriptando con RC4 (algoritmo de cifrado simétrico por stream) mediante la API de OpenSSL

a) Envío la cadena de caracteres "HolaMundo" al archivo y lo leo con "cat":


b) Encripto el archivo "mensaje" tomándolo como entrada, y obteniendo "mensaje.enc" como salida (cuando pide la contraseña de encriptación se puede poner cualquier cadena de texto, yo puse "0123"):


c) Compruebo la encriptación del archivo:


d) Desencripto y comparo:


Ejemplo 2: Encriptando con 3DES (algoritmo de cifrado simétrico por bloques, que cifra un cierto mensaje 3 veces utilizando claves aleatorias de 64 bits, razón por la cual es un tanto "lento").


Ejemplo 3: Lo mismo con el algoritmo -más moderno y rápido- AES (cifrado simétrico por bloques) de 256 bits en modo CBC:


Ejemplo 4: Finalmente, el mismo procedimiento pero esta vez utilizando el algoritmo de cifrado simétrico por bloques Blowfish (que por defecto utiliza claves de 448 bits):

viernes, 23 de noviembre de 2012

Uso de [m]awk en GNU/Linux

Hoy me interesó adentrarme un poco en el uso y la utilidad del comando awk en GNU/Linux. 
De hecho, es un lenguaje de programación en sí, con una sintaxis muy parecida a C. En Debian (al menos) la implementación e intérprete de awk recibe el nombre de mawk, y se utiliza mayormente para buscar patrones (modelos) en archivos de texto.
Del man page de mawk:
Un programa awk es una secuencia de pares patrón {acción} y definiciones de funciones. Los programas cortos en la línea de comandos generalmente se encierran en comillas simples para evitar que la consola los interprete, mientras que los más largos pueden ser leídos directamente desde un archivo utilizando la opción -f. Los datos de entrada son leídos desde la lista de archivos en la línea de comandos o desde la entrada estándar stdin si la lista es vacía. La entrada se descompone en registros, tal como se determina por la variable de separación de registros, RS. Inicialmente, RS="\n" (salto de línea) y cada fila se considera un registro separado. Cada uno de ellos se compara con el patrón especificado y si concuerda, se ejecuta el programa {acción}.
Un ejemplo: Tengo la siguiente hoja de cálculo en la que se detallan Nombre y Apellido, Usuario, Contraseña, y Email de un cierto grupo de personas (podrían ser un montón de campos y registros más, pero para la demostración estos son suficientes).

Figura 1: Hoja de cálculo

Lo que quiero obtener es la dirección de email de un cierto registro, y mostrarlo junto con el Nombre y Apellido del mismo.

PRIMER PASO: Guardo el contenido de la hoja de cálculo en formato .csv:

Figura 2: Archivo de texto plano

SEGUNDO PASO: Desde la consola ejecuto el siguiente comando (si quisiera los datos mencionados anteriormente para Elvis Tek):


RESULTADO:


Figura 3: Ejecución del comando y resultado

Explicación de la sintaxis del comando:
  1. -v var=valor   asigna valor a la variable var. En este caso (OFS="\t"), se asigna a la variable OFS (Output Field Separator) el valor tabulador, para separar cada campo de la salida (resultado).
  2. BEGIN   La palabra reservada BEGIN indica el comienzo del programa interpretado por awk, el cual puede especificarse en la misma línea del comando o desde un archivo que contenga las instrucciones. 
  3. {FS=","}   FS (Field Separator) indica el caracter que se utiliza para separar los campos en el archivo que se toma como entrada (en este caso, ~/pruebas/nombres y usuarios.csv).
  4. $1=="Elvis Tek" {print $1,$4}   Si el primer campo del archivo de entrada contiene la cadena Elvis Tek, devolver los campos $1 y $4, que según se pueden ver en la figura 1, corresponden a Nombre y Apellido, y Email, respectivamente.

Génesis

Comienzo este blog para documentar las cosas que hago y que aprendo con GNU/Linux, lenguajes de programación (C#, Bash scripting, Java, Python, Ruby, PHP, Vbscripting... sí, todavía algo se usa), bases de datos (SQL Server, MySQL), y desarrollo de aplicaciones web (HTML5, CSS / CSS3) tanto por mi trabajo (soy desarrollador junior en una empresa cuyo principal cliente es la mayor compañía de productos masivos de consumo a nivel mundial) como en cosas personales.
Bastante variadito, pero acá vamos...