Noticias Weblogs Foros Wiki Código

Meta-Info

¿Que es?

Planeta Código es un agregador de weblogs sobre programación y desarrollo en castellano. Si eres lector te permite seguirlos de modo cómodo en esta misma página o mediante el fichero de subscripción.

rss subscripción

Sponsors

Puedes utilizar las siguientes imagenes para enlazar PlanetaCodigo:
planetacodigo

planetacodigo

Si tienes un weblog de programación y quieres ser añadido aquí, envíame un email solicitándolo.

Idea: Juanjo Navarro

Diseño: Albin

Archivos

HardBit

Inno Setup Unicode con ISSkin

Noviembre 25th, 2009

Los que usan Inno Setup, sabran que hay una actualización de Inno Setup 5.3.6 y tambien que existe una version Unicode de este generador de instaladores, para ponerle skins (pieles!!) a nuestro instalador pueden hacer uso de una extension gratuita que ofrece CodeJock llamada ISSkin, bien el punto de este post es que la version que ofrece en el sitio solo funciona con la version ANSI y no la Unicode de Inno Setup, asi que les dejo la DLL para que funcione en Unicode ISSkin Unicode

Es todo.

» Leer más, comentarios, etc...

Fetishcode...Thinking in objects

Revisión de la demo de ADF 11g, FOD.

Noviembre 25th, 2009

A

» Leer más, comentarios, etc...

xailer.info (esp)

Los asistentes de Xailer 2

Noviembre 24th, 2009

Estimados usuarios de Xailer,

La versión definitiva de Xailer 2 incorpora un gestor de asistentes que facilita enormemente la creación de formularios rutinarios y/o repetitivos. Un ejemplo típico de un formulario de este tipo sería aquel que creamos cada vez que queremos realizar la edición de todos los campos de una tabla en cualquier tipo de mantenimiento.

Primero vamos a ver lo fácil que resulta utilizar cualquier asistente, para luego adentrarnos en la modificación o creación de nuestros propios asistentes, que es igualmente fácil.

Para acceder a la opción de Asistentes utilizaremos la opción de menú Componentes->Asistentes y se nos mostrará el siguiente diálogo:

Wizards dialog

Observe que todos los asistentes están incluidos de alguna forma dentro de una DLL. Dicha DLL ha sido creada por el propio Xailer, y de hecho podrá incluso analizar su código fuente en el directorio \samples\Wizards. Por supuesto también podrá modificarla y reconstruirla para que los asistentes se adapten a su forma de trabajo.

Las DLL de los asistentes deben de estar ubicadas necesariamente en los directorio \Xailer\Template o \Xailer\User.

Una vez seleccionado un asistente en concreto entra en funcionamiento el código interno del mismo que o bien puede directamente realizar el trabajo requerido o es posible que le muestre algún diálogo para pedirle algún dato adicional.

Si selecciona el asistente DBF table assistant que permite crear un formulario de mantenimiento de tablas DBF, se le mostrará el siguiente diálogo:

DBF editor wizard/>

Simplemente indique como quiere que se comporte el asistente para cada tipo de datos que pueda tener el fichero DBF y pulse el botón Run y podrá observar como de forma instantánea el formulario es creado por usted

La creación o modificación de asistentes es igualmente sencilla, y si le echa un vistazo al ejemplo \samples\wizards\Basic se dará cuenta inmediatamente de ello. Básicamente todo el trabajo consiste en crear una clase descendente de TWizard que tan sólo necesita sobrecargar el método Run(). Eso es todo.

Lo más sencillo es ver un pequeño ejemplo:

  1. CLASS TWzdSample FROM TWizard
  2.  
  3.    METHOD Run()
  4.  
  5. END CLASS
  6.  
  7. METHOD Run() CLASS TWzdSample
  8.  
  9.    LOCAL oForm
  10.    LOCAL oObj
  11.  
  12.    oForm := ::AddForm()
  13.  
  14.    oForm:SetBounds( 246, 223, 307, 137 )
  15.    oForm:SetClientSize( 299, 103 )
  16.  
  17.    WITH OBJECT oObj := TLabel():New( oForm )
  18.       :SetBounds( 12, 12, 26, 14 )
  19.       :cText := "User:"
  20.    END
  21.  
  22.    ::AddComponent( oObj, oForm )
  23.  
  24. RETURN Nil

Este pequeño ejemplo lo único que hace es crear un nuevo formulario en el IDE y añadir un objeto TLabel. Observe las llamadas a AddForm() y AddComponent() que son métodos de la propia clase TWizard.

Para que el IDE sea capaz de reonocer ese código dentro de la DLL es necesario indicarle su existencia en un INIT PROCEDURE dentro de la propia DLL y utilizando la función RegisterWizard. Como suele ocurrir, un ejemplo es lo más descriptivo para entenderlo:

  1. INIT PROCEDURE WzdInit()
  2.  
  3.    RegisterWizard( "A sample",;
  4.       {|| TWzdSample():New() },;
  5.       "comments",;
  6.       cBitmap )
  7.  
  8. RETURN

A continuación os dejo el prototipado de la clase TWizard cuya documentación se encontrará en la ayuda del propio IDE para que veáis todos los miembros de dicha clase cuyo uso es prácticamente auto explicativo.

  1. CLASS TWizard FROM TComponent
  2.  
  3.    PROPERTY aForms
  4.    PROPERTY oActiveForm
  5.  
  6.    METHOD SetActiveModule( cModule ) // –> Nil
  7.    METHOD AddForm( lShow ) // –> oForm
  8.    METHOD AddModule( cType )  // –> cModule
  9.    METHOD AddComponent( oObject, oParent ) // –> lSuccess
  10.    METHOD AddCode( cCode ) // –> lSuccess
  11.    METHOD AddMethod( cMethod, cParams, cBody, cReturn ) // –> lSuccess
  12.    METHOD AddFunction( cMethod, cParams, cBody, cReturn, lStatic ) // –> lSuccess
  13.    METHOD AddProcedure( cMethod, cParams, cBody, lStatic ) // –> lSuccess
  14.    METHOD AddProperty( cName, cClauses ) // –> lSuccess
  15.    METHOD AddEvent( cName, cParams ) // –> lSuccess
  16.  
  17.    METHOD TabWidth() // –> nTabWidth
  18.    METHOD ProjectDir() // –> cDir
  19.  
  20.    METHOD Run() VIRTUAL
  21.  
  22. ENDCLASS

Un cordial saludo,

[El equipo de Xailer]

» Leer más, comentarios, etc...

Cerebro en la Sombra » Técnico

HTPC (Home Theater PC)

Noviembre 24th, 2009

Si hace unas semanas os hablaba del DVD grabador de mis padres, hoy voy a enseñaros uno de mis juguetes, la evolución natural de esos cacharros, el HTPC.

Los HTPC son ordenadores cuya principal función es servir de plataforma de ocio y entretenimiento: televisión, dvd, reproductor de vídeos, música, fotos… todo lo hace él solito y con una gran ventaja: en cualquier momento puedes actualizar las partes de hardware que se hayan quedado obsoletas y tener tu aparato actualizado permanentemente.

El mío tiene ahora dos años y medio y en líneas generales es esto:

El aparato se complementa con un receptor A/V Denon AVR-2802,  7 cajas acústicas (JBL e Infinity),  un subwoofer Yamaha,  un televisor LCD Samsung de 32” y un mando a distancia Logitech Harmony 555.

IMG_6257

La caja

Es el punto más crítico e importante de un aparato de este tipo ya que normalmente querremos colocarlo en el salón de casa y no nos gustaría que desentonase, que se viese la típica caja de ordenador. Desde el principio tenía claro que buscaba una caja que no fuese excesivamente grande, a ser posible del tamaño de un DVD o similar. La mayoría de modelos son, en cuanto a tamaño, como una minitorre de ordenador tradicional en horizontal, muy altos, cosa que no me convencía. Buscando encontré la que terminé comprando, Thermaltake Mozart SX, buen precio, mando a distancia, buena disipación, dos ventiladores incorporados… me pareció perfecta y que era lo que yo buscaba, sin embargo no es oro todo lo que reluce.

Seguramente el sitio más completo donde puedes buscar componentes de este tipo es Sistemas Ibertrónica.

IMG_6258Los componentes

Cuando comencé a montar el aparato me di cuenta de que la escasa altura de la caja penalizaba las opciones de ampliación del aparato con tarjetas PCI ya que no se pueden poner tal cual, son más grandes que la caja. Para solucionarlo viene de serie con un adaptador que expande la ranura PCIe y dos PCI de la placa en horizontal tal y como podéis ver en la imagen de abajo. En general debiera ser más que suficiente, pero no tiene por qué ser así. Otro detalle importante a tener en cuenta es que la placa hay que escogerla cuidadosamente ya que, para poder utilizar el adaptador que os he comentado, la ranura PCIe tiene que estar situada en la posición exacta donde se sitúa el adaptador, de otro modo no podremos pincharla.

En mi caso tengo pinchadas la tarjeta gráfica y la sintonizadora de TV como podéis ver. En la ranura de abajo de todo tengo el adaptador de la placa para sacar la salida de audio digital y no puedo poner nada más que eso, la ranura PCI en sí queda totalmente inutilizada ya que la tarjeta gráfica es más “gorda” de lo habitual y se come el espacio disponible. En mi caso no he tenido problemas, todo lo que necesitaba está ahí, pero si necesitas algo más no tendrás donde ponerlo. De hecho una de las razones de poner la sintonizadora dual fue precisamente la imposibilidad de poner dos sencillas.

La gráfica se conecta al televisor a través de un cable DVI-HDMI con lo que la visualización es increíblemente perfecta. Hasta hace un par de meses tenía otra gráfica, pero se estropeó :P , en realidad la estropeé yo. Traía uno de esos pequeños ventiladores que traen las gráficas y al poco tiempo comenzó a hacer un ruido muy molesto, con lo que decidí desconectarlo y que aguantase con el disipador lo que pudiese. Al final fueron más de dos años, no está mal. Para la nueva tenía claro que la quería silenciosa, sin ventilador, pensáoslo bien antes de comprar una con ventilador, los de estas tarjetas suelen ser de muy baja calidad.

blog_IMG_6253Aquí os muestro una panorámica del equipo montado, queda todo muy limpio y accesible, la verdad. Una de las ventajas que tiene es que la fuente de alimentación es de tamaño normal, no tienes que preocuparte si se estropea. En aparatos tipo barebone tienes un grave problema si se estropea la fuente, y tarde o temprano se estropeará. El disco IDE que tengo es porque ya lo tenía :P , tengo ganas de quitar el cable IDE amarillo que se ve y que abulta muchísimo y  sustituirlo por los sencillos Serial ATA, pero mientras funcione tampoco lo vamos a jubilar :)blog_IMG_6250He pensado más de una vez en ponerle un lector Blu Ray y aprovechar la calidad de imagen que ofrece, pero después pienso, ¿para qué si no alquilo una película desde 2001?.

El software

Hasta hace un par de semanas estaba con Windows XP Media Center Edition 2005, pero lo actualicé a Windows7 viendo las buenas referencias y creedme, es un lujazo verlo funcionar ahora, el buen rendimiento que tiene se une a las prestaciones del nuevo Media Center dando como resultado una plataforma de ocio multimedia que roza la perfección, aunque siempre hay cosas que te gustaría cambiar :) . En su día probé otros programas media center, el mejor y más completo es, sin duda, Media Portal, también probé soluciones bajo Linux, MythTV y Freevo, pero no acabaron de convencerme, quizás les de otra oportunidad un día de estos.

Hace mucho tiempo que quiero integrar Imagenio en el Media Center y tenerlo todo centralizado, pero no había manera de hacerlo hasta que apareció DVBLink for IPTV, un pequeño pero gran software que crea sintonizadoras virtuales para importar en Media Center los canales de televisión IP de forma que quedan integrados como cualquier otro canal de TV, pudiendo programar las grabaciones o verlos con un sólo click en el mando. DVBLink for IPTV cuesta unos 20 euros, un precio más que asequible para las ventajas que aporta, al menos yo lo veo así.

La prueba de fuego que le hice es grabar tres programas simultáneamente (uno en cada sintonizador TDT y otro desde Imagenio) y, mientras tanto, reproducir una película. Todo perfecto, no se puede pedir más.

El mando a distancia

Posiblemente el elemento más importante y el que más desapercibido pasa de todo el sistema si no quieres tener varios mandos a la vez entre tus manos.

Hasta hace un par de meses tenía un One-for-All Kamaleon que compré allá por 2002, pero también se estropeó :P , así que me decidí por un Logitech Harmony 555, muy buena relación calidad-precio y, sobre todo, con soporte directamente para el mando de las cajas Thermaltake.

IMG_6260

La verdad es que la curva de aprendizaje del mando y el tiempo de puesta en marcha completa son muy elevados, una vez tienes claro como funciona llega el momento de ir ajustando cada botón para que haga lo que tu quieres. Aunque tiene el clásico modo de funcionamiento de todos los mandos basado en dispositivos, es decir, funcionar como cada mando por separado, el funcionamiento principal se basa en actividades, lo que despista mucho al principio. Por ejemplo:

De esta manera con un sólo botón preparas el ambiente que vas a utilizar. El modo de actividades permite, además, combinar en el teclado del mando funciones de distintos aparatos, por ejemplo, que el volumen maneje el receptor A/V, otro botón el cambio de fuente en la TV, los de play/stop el Media Center, etc. En el modo dispositivo, cada mando simula ser el mando original completo sin posibilidad de intercalar funciones de otros mandos.

Conclusiones

Como casi todo en la vida, tiene sus pros y sus contras.

A favor, sin duda, la versatilidad, la sencillez de manejo y la centralización de todo tu ocio multimedia en un sólo aparato

En contra… quieras o no,  es un ordenador con todos los inconvenientes que conlleva también eso para la gente no técnica. Si estás cansado de que familiares y amigos te llamen cada vez que tienen un problema con su ordenador, ni se te ocurra recomendarles que se pongan un cacharro de estos. Son muy apetecibles para todo el mundo pero dado que son tan abiertos a poder hacer casi de todo, la cantidad de problemas que pueden surgir son muy elevados. Sólo aptos para usuarios muy avanzados.

En cuando al hardware, lo más importante en este tipo de aparatos es la caja, yo he contado mi experiencia. Quizás hoy me  hubiese comprado una más normal en cuanto a tamaño de manera que pudiese utilizar las tarjetas PCI en su forma habitual, no lo sé, pero aún así estoy muy contento con la que tengo, es amplia y está muy bien refrigerada. Con este tipo de cajas hay que tener mucho ojo con la placa que compras, no sirve cualquiera ya que hay que hacer coincidir la ranura PCIe con el hueco adecuado para el adaptador horizontal. De igual modo cuando veas cajas mira una que venga con el display y el mando incorporados, comprarlos después te saldrá más caro y posiblemente no se integren a la perfección.

Para los demás componentes no creo que haya que irse a componentes de última generación, ya veis mi equipo, normalito y se mueve a la perfección.

Finalmente gástate algo de dinero en un buen mando universal que te permita tener todo unificado en un solo aparato, a la larga lo agradecerás, no tengo más que decir, creo que no haya que pensar mucho para darse cuenta de las ventajas :P .

Logitech Harmony 555

» Leer más, comentarios, etc...

Fetishcode...Thinking in objects

JSF y su valor añadido

Noviembre 24th, 2009

A

» Leer más, comentarios, etc...

Buayacorp

Archivos de WordPress útiles y efectivos

Noviembre 24th, 2009

Cómo crear una página de archivos de WordPress útil y efectiva.

» Leer más, comentarios, etc...

4 bits blog

Cómo proteger las contraseñas de los usuarios

Noviembre 22nd, 2009

Voy a recuperar otro de mis documentos perdidos en Google Docs (el anterior fue el de las autotools), esta vez se trata de un pequeño manual sobre cómo proteger las contraseñas de lo usuarios de cualquier aplicación que se programe, el manual es una traducción al español del artículo How to encrypt user passwords de Daniel Fernandez.

1. Visión general

Casi todas las aplicaciones web modernas necesitan, de un modo u otro, cifrar las contraseñas de sus usuarios. Se podría decir que, desde el momento en que la aplicación tiene usuarios, y los usuarios se identifican usando una contraseña, esas contraseñas se deben guardar usando algún tipo de cifrado.

Hay muchas razones básicas para esto: las bases de datos pueden estar comprometidas, y por tanto también las comunicaciones. Pero la razón más importante es que se tiene que pensar que las contraseñas de los usuarios son datos personales. Sus contraseñas son sus claves para su privacidad, por tanto son personales, y nadie tiene el derecho de conocerlas. Y se debe cumplir esto si se quiere ganar la confianza de los usuarios.

2. El algoritmo

Ahora que se quieren cifrar las contraseñas, se debe saber cómo. Aquí entra la primera regla:

I. Cifrar las contraseñas usando técnicas de un sentido, es decir, funciones resumen (o hash).

Esto se debe a que, excepto para algunos escenarios específicos, no hay ninguna razón para que una contraseña sea descifrada. Si se cifran las contraseñas usando cifrados basados en claves (una técnica de dos sentidos) y un atacante consigue saber la clave de cifrado, se revelarán todas las contraseñas. Si no se tiene una clave para el cifrado, el riesgo desaparece, y el atacante tendrá que confiar en el uso de técnicas de fuerza bruta o similares.

Pero, ¿qué ocurre si un usuario pierde su contraseña? ¿No podrá recuperarla? La respuesta es NO. No sólo no se puede recuperar, si no que ni siquiera existe una manera de leer/conocer/ver las contraseñas de los usuarios, no importa si se es el administrador del sistema. Si un usuario pierde su contraseña, sólo se podrá reiniciarla a un nuevo valor y enviárselo por algún canal seguro al usuario, y pidiéndole que la cambie lo más pronto que pueda.

Ahora que está claro que las funciones resumen son necesarias en las contraseñas, ¿cuál algoritmo se debería usar? Hay bastantes, y dependen de las necesidades de cada uno. Los más usados son:

En la mayoría de los casos, MD5 o SHA-1 serán elecciones adecuadas para los resúmenes de contraseñas, aunque aplicar estos algoritmos no será suficiente, como se verá a continuación.

Cuando se dice que se deberían usar funciones resumen para los cifrados de las contraseñas, y dado que estas funciones resumen son técnicas de un sentido, la siguiente pregunta es: «Si no se pueden descifrar las contraseñas, ¿cómo se comprueba que un usuario tiene una contraseña correcta?»

Hay una respuesta muy simple a esta cuestión, que será la segunda regla:

II. La entrada y las contraseñas guardadas se comparan usando los resultados de las funciones resumen, no usando cadenas sin cifrar.

Lo que significa que, una vez los usuarios han introducido sus contraseñas en la identificación, se realizará la función resumen sobre la contraseña introducida con el mismo algoritmo que se ha usado con las contraseñas guardadas, y se compararán ambos resultados. Como estas funciones garantizan que dos entradas iguales obtienen el mismo resultado (lo que no es cierto en el sentido contrario), si los resultados coinciden se considerará que la contraseña introducida por el usuario es correcta.

3. Mejorando la seguridad de los resúmenes

Todos los algoritmos de funciones resumen mencionados anteriormente comparten una característica: son públicos. Son algoritmos muy conocidos y ampliamente implementados, por lo que cualquiera puede usarlos.

Si cualquiera puede usar el mismo algoritmo que la aplicación, y por alguna razón los atacantes pueden ver la base de datos de los resúmenes de las contraseñas, ¿cómo se puede estar seguro que los atacantes no serán capaces de conseguir alguna contraseña de los usuarios probando todas las posibilidades hasta que encuentren algún resumen que coincida con uno de los guardados?

La respuesta es que no se puede. Pero se puede hacer que todo eso sea una tarea enorme y con un gran tiempo de realización, de modo que no resulte útil, a menos que puedan esperar toda la eternidad. Para lograr esto, se van a explicar dos conceptos: «salt» y el contador de iteración.

3.1. «Salt»

«Salt» es una secuencia de bytes que se añaden a la contraseña antes de conseguir su resumen. Esto hace que estos resúmenes sean diferentes a los que deberían ser usando sólo la contraseña, y como resultado se consigue protección contra los ataques de diccionario. Se pueden seguir dos estrategias para usar «salt»:

En la práctica, un «salt» aleatorio (o variable) es la mejor idea porque, aunque al generarse aleatoriamente tendrá que guardarse junto al resumen de la contraseña (por lo que cualquiera podrá recuperarlo) y esto hará que sea trivial para un atacante conocerlo, permitirá que cada contraseña de usuario sea independiente del resto, por lo que tendrán que atacarse una por una.

Se tiene que pensar que, si se usa un «salt» fijo y el atacante consigue saberlo, la seguridad de toda la base de datos de contraseñas será nula. Y hay muchos métodos para que el atacante pueda conocer este «salt», como aplicar fuerza bruta en sus contraseñas o en contraseñas que tenga de algún usuario válido. En un escenario de un «salt» fijo, una contraseña débil podría hacer que el sistema de contraseñas fuera débil.

Sin embargo, si se quiere mantener una parte del «salt» en secreto, se puede usar una técnica que mezcle las otras dos, usando un «salt» compuesto de una parte fija y otra aleatoria, guardando los bytes aleatorios junto al resumen de la contraseña.

El tamaño mínimo de un «salt» es de 8 bytes. Si se usa una opción mixta, al menos 8 bytes deberían ser aleatorios.

Así, se puede definir la tercera regla:

III. Se debe usar un «salt» que contenga al menos 8 bytes aleatorios, y añadir esos bytes junto al resumen de la contraseña.

3.2. El contador de iteración

El contador de iteración es el número de veces que la función hash que realiza el resumen se aplica a sus propios resultados.

Esto significa que, una vez se ha seleccionado un «salt» y concatenado con la contraseña, se deberá aplicar la función hash (por ejemplo, MD5), conseguir el resultado, y pasarlo de nuevo como entrada a la misma función, y hacer lo mismo las veces que indique el contador de iteración.

El número mínimo recomendado de iteraciones es 1.000, y esto proporcionará una buena seguridad extra. Hay que pensar que, cuando se crea un único resumen de una contraseña para un nuevo usuario, la diferencia entre aplicar la función hash una vez o 1.000 veces no será un problema, tal vez doscientos milisegundos, pero los atacantes deberán tener que generar una enorme cantidad de intentos de resumen mediante fuerza bruta y, para un atacante, la diferencia entre aplicar la función hash una vez y aplicarla mil veces para cada intento será un gran problema computacional.

Así, se obtiene la cuarta regla:

IV. Iterar la función hash al menos 1.000 veces.

4. Secuencia de traducción de caracteres a secuencia de bytes

Antes de poder guardar correctamente los resúmenes de las contraseñas, hay algo que se debería tener en cuenta, que es la diferencia entre cadenas de caracteres y secuencias de bytes: dos cadenas de caracteres se pueden representar con diferentes secuencias de bytes dependiendo de la codificación empleada (ISO-8859-1, UTF-8, …)

Esto afecta, ya que las contraseñas suelen ser cadenas de caracteres, pero las funciones hash trabajan a nivel de byte.

4.1. Problemas codificando la contraseña introducida

En el supuesto de que un nuevo usuario se identifique con una contraseña que no contiene caracteres ASCII, y que la aplicación de identificación, que se está ejecutándo en Windows 2000 en Europa Occidental, convierta la cadena de caracteres a bytes sin elegir una codificación específica para la operación, e incluso usando la que haya de forma predeterminada, en Windows suele ser ISO-8859-1. De modo que el resumen se realice sobre esa secuencia de bytes y quede almacenado.

Entonces, este usuario vuelve de nuevo y esta vez no visita la aplicación de identificación anterior, en vez de eso usa cualquier otra aplicación con la misma base de datos de contraseñas pero en Linux. El usuario introduce correctamente su contraseña y … ¡no coincide!

¿Por qué? Porque la mayoría de los sistemas Linux, usan UTF-8 como codificación predeterminada, y las contraseñas que ha introducido el usuario en ambos casos se han codificado en diferentes secuencias de bytes, afectando a la correcta concordancia de las contraseñas.

Cómo se puede resolver esto, pues utilizando una codificación fija para las codificaciones de las cadena de caracteres a secuencia de bytes. Así se enuncia la quinta regla:

V. Antes de resumir, realizar una codificación de cadena de caracteres a secuencia de bytes usando una codificación fija, preferiblemente UTF-8.

Si se usa Java, donde las cadenas de caracteres (clases String) se codifican independientemente (aunque usan de fondo UTF-16), no habrá que preocuparse de si la aplicación usa ISO-8859-1 o alguna otra codificación en lugar de UTF-8 para su interfaz de usuario, al igual que no será necesario que la codificación para los resúmenes de las contraseñas coincidan con las de la interfaz de usuario. Sólo será necesario que la codificación sea una fija, y UTF-8 proporciona un buen equilibrio entre tamaño y conjunto de caracteres.

4.2. Problemas codificando en el almacenamiento del resumen

Normalmente se quiere gestionar y almacenar el resumen de contraseñas como una cadena de caracteres, pero la función hash dará como resultado una secuencia de bytes que no necesariamente representará un carácter válido en alguna codificación. Por esto, la secuencia de bytes del resumen no se puede codificar en una cadena de caracteres, habiendo peligro de pérdidas de datos si se realizase.

Aquí es donde entra al rescate la codificación BASE64. Codificando la secuencia de bytes del resumen en BASE64, se asegura que la secuencia de bytes de salida representa una cadena de caracteres US-ASCII válida. Por lo que se podrá codificar una secuencia de bytes en BASE64 en una cadena de caracteres US-ASCII.

VI. Finalmente, se debe aplicar la codificación BASE64 y guardar el resumen como una cadena de caracteres US-ASCII.

5. Resumen de las reglas para el cifrado de contraseñas

La lista completa de reglas a aplicar:

  1. Cifrar las contraseñas usando técnicas de un sentido, es decir, funciones resumen (o hash).
  2. La entrada y las contraseñas guardadas se comparan usando los resultados de las funciones resumen, no usando cadenas sin cifrar.
  3. Se debe usar un «salt» que contenga al menos 8 bytes aleatorios, y añadir esos bytes junto al resumen de la contraseña.
  4. Iterar la función hash al menos 1.000 veces.
  5. Antes de resumir, realizar una codificación de cadena de caracteres a secuencia de bytes usando una codificación fija, preferiblemente UTF-8.
  6. Finalmente, se debe aplicar la codificación BASE64 y guardar el resumen como una cadena de caracteres US-ASCII.

6. Realizándolo en Java

La forma más sencilla de cifrar contraseñas en Java, mediante las técnicas explicadas es usar Jasypt.

Si no se puede usar jasypt, o si por alguna razón se quiere desarrollar alguna característica de cifrado propia, se necesitarán:

También, se puede utilizar el código fuente para las clases org.jasypt.digest.StandardByteDigester y org.jasypt.digest.StandardStringDigester, disponible en el repositorio de jasypt.

7. Defensa frente a los típicos ataques

7.1. Ataques de fuerza bruta

Realizado sobre: Una única contraseña.

Descripción: El atacante intenta conseguir la contraseña del usuario generando todas las contraseñas posibles, resumiéndolas y probando si coinciden con el resumen de la contraseña del usuario.

Defensa: La iteración de la función hash un número de veces, como 1.000 (mínimo recomendado), el coste de la creación del resumen de la contraseña en el tiempo de identificación del usuario no es significante, pero el coste de un ataque de fuerza bruta por parte de un atacante que genera millones de resúmenes será muy grande. Hay que recordar que una de las mejores maneras de proteger los datos cifrados es haciendo que el coste de romper la seguridad sea más alto de lo que cuesta el esfuerzo.

7.2. Ataques de diccionario

Realizado sobre: Cada contraseña o una base de datos de contraseñas

Descripción: El atacante intenta conseguir la contraseña de un usuario comparando sus resúmenes contra un conjunto de resúmenes de contraseñas más probables, normalmente se generan desde una lista de palabras de un diccionario. Este ataque explota una debilidad actual de las aplicaciones, ya que muchos usuarios usan palabras del diccionario como contraseña.

Defensa: Añadiendo un «salt» aleatorio, la debilidad de las contraseñas basadas en diccionario se reduce, y la posibilidad de de que el resumen aparezca en un conjunto de resúmenes previamente creados por el atacante es mínima.

7.3. Ataques de cumpleaños

Realizado sobre: La base de datos de las contraseñas.

Descripción: Este ataque explota la paradoja del cumpleaños, la cual en resumen consiste en, teniendo un gran conjunto de resúmenes de contraseñas, las posibilidades de generar una contraseña cuyo resumen coincida con al menos uno de los resúmenes en el conjunto es mucho más alto que lo esperado. Y estas posibilidades aumentan bastante cuando el tamaño del conjunto (el número de usuarios) aumenta.

Defensa: Añadiendo un «salt» aleatorio las posibilidades de que un ataque de cumpleaños tenga éxito son mínimas, porque el atacante tendría que atacar cada contraseña por separado, y no el conjunto de contraseñas, para encontrar una coincidencia. Esto es porque se tendría que encontrar una contraseña que crease el mismo resumen que el del atacante usando el mismo «salt» que se usó para el resumen, y que es diferente para cada contraseña haciendo que el ataque pase a ser de fuerza bruta.

Espero que este pequeño manual os sea de utilidad, a mí me sirvió para mi PFC.

» Leer más, comentarios, etc...

Ingenieria de Software / Software Engineering

Microsoft Project Admin Blog

Noviembre 21st, 2009

Con gusto recibo el post donde se anuncia el nuevo blog para administradores de Project Server y para muestra un excelente post el cual menciona los requerimientos de instalación.

» Leer más, comentarios, etc...

4 bits blog

Primeros pasos con django

Noviembre 20th, 2009

Hace tiempo estuve aprendiendo a programar en Python porque me apeteció y porque me tocó lidiar en el trabajo con una aplicación web, la cual realicé en django.

¿Qué es django?

Django es un entorno de desarrollo (lo que en inglés se denomina framework) para la creación rápida de aplicaciones web, basándose en el MVC (Modelo-Vista-Controlador).

Entre todas las posibilidades que ofrece están que permite trabajar con las bases de datos como si no existieran, la creación de URL bonitas sin tener que tocar nada del servidor web, el uso de plantillas en (X)HTML para la creación de las diferentes páginas, y muchas cosas más, todas ellas estupendas y supongo que todas ellas también las tendrán otros entornos similares que utilicen otros lenguajes de programación.

Iniciando un nuevo proyecto

Lo primero que se debe hacer en django es crear lo que se denomina un proyecto, éste a su vez contendrá aplicaciones que serán las que contengan el código utilizado en la aplicación web. Por poner un ejemplo: el proyecto sería un CMS y las aplicaciones las diferentes funcionalidades de dicho CMS.

Para ello se deberá ejecutar:

$ django-admin.py startproject nombre_del_proyecto

Esto creará un directorio, llamado «nombre_del_proyecto», con los archivos básicos de todo proyecto de django:

Lo malo es que sólo con esto no se va a poder hacer nada más que cambiar unos cuantos valores de la configuración, para que un proyecto haga algo deberá tener al menos una aplicación que contendrá el código necesario.

Iniciando una nueva aplicación

Para crear una aplicación se debe usar el archivo «manage.py» del proyecto del siguiente modo:

$ manage.py startapp nombre_de_la_aplicación

Esto creará un directorio, llamado «nombre_de_la_aplicación», con los archivos básicos de toda aplicación de django:

Para que esta aplicación esté disponible en el proyecto, hay que añadirla a la lista de aplicaciones del proyecto que está en el archivo «settings.py».

INSTALLED_APPS = (
    'hello_world.hello_app',
)

Nota: Cuando se crea un nuevo proyecto django crea una lista de aplicaciones predeterminada, que en este caso daría lo mismo borrarlas.

Creando un «hola mundo»

Lo primero será crear un proyecto («hello_world») y una aplicación («hello_app») para dicho proyecto, tal y como se ha mencionado antes. Una vez hecho, se deberá crear una vista para la página web.

Creando una vista

Para la creación de una vista, se debe editar el archivo «views.py» de la aplicación creada del siguiente modo:

# views.py
# -*- coding: utf-8 -*-
# Views used in hello world application.

from django.shortcuts import get_object_or_404, render_to_response

def hello:
    """Hello view function."""

    return render_to_response ('hello.htm', { 'hello_msg' : '¡Hola mundo!' })

La función render_to_response usa una plantilla (que ahora se explicará) para crear la página web de la vista.

Creando una plantilla

Django dispone de un lenguaje propio para la creación de plantillas, básicamente son archivos HTML con unas etiquetas especiales, que se marcan con llaves dobles, que django se encargará de rellenar.

De este modo, crear una plantilla es tan sencillo como crear un archivo html en un directorio llamado «templates» dentro del directorio del proyecto o de la aplicación. En este caso valdría crear un archivo llamado «hello.htm» (es el que se usa en la función hello) en el directorio «templates» de la aplicación «hello_app».






    
    {{ hello_msg }}



    

{{ hello_msg }}

Esta es una plantilla muy sencilla, el lenguaje de las plantillas de django permite realizar muchas más cosas, como herencia entre plantillas, definir bloques, bucles, …

Definiendo una dirección para la vista

Una vez creada la vista y su plantilla, habrá que definir una dirección para poder acceder a la vista. Como se mencionó al principio, para eso está el archivo «urls.py» del proyecto. Este archivo contiene una lista de direcciones a las que se les asignará unas vistas, de modo que cuando se abra esa dirección la vista asignada se encargue de crear su correspondiente página web.

En este caso, el archivo «urls.py» quedaría del siguiente modo:

# urls.py
# -*- coding: utf-8 -*-
# Django URL patterns for hello world project.

from django.conf.urls.defaults import *

urlpatterns = patterns('',
    (r'', 'hello_world.hello_app.views.hello'),
)

Como se puede ver, lo único que se hace es añadir un patrón (una expresión regular) con una vista asociada. En este caso se trata de una dirección vacía (r''), la raíz del dominio, a la que se asocia la función hello que se definió en las vistas de la aplicación.

Probando la aplicación web

Una vez llegado a este punto, ya se puede probar la aplicación web, para ello no hace falta tener ningún servidor web instalado, ya que django dispone de uno para realizar pruebas. Para ejecutarlo, desde el directorio del proyecto:

$ python manage.py runserver

Y aquí concluye esta introducción básica, pero larga, próximamente más. Si os ha gustado y queréis ir aprendiendo por vuestra cuenta, siempre podéis leer la documentación oficial de django.

» Leer más, comentarios, etc...

Arragonán

Testeando respuestas JSON con Grails

Noviembre 20th, 2009

Aunque en la documentación de Grails aparece un ejemplo de como escribir un test para una acción que recibe una petición en formato XML o JSON, no lo hace de como escribir un test de una acción que genera el JSON, que tampoco es que sea precisamente complicado.

Si lo único que quisieramos probar es que, en una cadena JSON, se está devolviendo algún valor que estuvieramos esperando, podríamos utilizar el contenido que devuelve la response como una cadena(con contentAsString) y hacer alguna comprobación sobre el texto:

def response = controller.response.contentAsString
assertTrue response.contains('"name":"Gustavo Poyet"')
assertTrue response.contains('"goals":63')

Pero claro, este test es un muy ligero y no prueba demasiado. Si quisieramos probar más a fondo la respuesta(estructura, un elemento concreto de un array, etc), podríamos usar contains sobre la cadena devuelta, convertir tipos… vamos, que sería más que posible que el código del test terminara siendo infumable. Pero está disponible out of the box el converter JSON de Grails, que permite testear más a fondo fácilmente y con un código mucho más claro.

Es muy posible que si alguien se ve en la necesidad de escribir un test para una acción que devuelve un JSON, ya conozca el converter, por que es una de las alternativas que hay para hacerlo:

render object as JSON

Pues esa misma clase, tiene el paso contrario, pasar una cadena a un objeto groovy/java(JSONElement). De esta forma ya nos ahorraremos trabajo sucio y el código quedará bastante claro:

def response = controller.response.contentAsString
def responseJSON = grails.converters.JSON.parse(response)
assertNotNull responseJSON.players
assertEquals 5, responseJSON.players.size()
assertEquals 63, responseJSON.players[0].goals
assertEquals "Gustavo Poyet", responseJSON.players[0].name

» Leer más, comentarios, etc...

Fetishcode...Thinking in objects

Nueva demo de ADF Faces 11g

Noviembre 19th, 2009

A

» Leer más, comentarios, etc...

Buayacorp

Chuleta para hacer temas en Drupal

Noviembre 17th, 2009

Un interesante cheatsheet o chuleta para hacer temas en Drupal.

» Leer más, comentarios, etc...

Developing my life » desarrollo

GNOME Perú

Noviembre 17th, 2009

GnomeLove

El dia sabado 14 de noviembre se hizo la presentacion oficial de la comunidad de GNOME Perú en el III FESOLI de la Universidad Inca Garcilazo de la Vega, en el stand estuvimos Marco Villegas, Sergio Infante, Diego Escalante, Cinthia Chavez y yo, la pared de amor y odio (bueno es este caso fue mesa :P ), asi como los stickers que ofrecimos se acabaron todo, nosotros pensabamos que nos iban a sobrar, al final fue un exito total \o/.

Gente en el stand de GNOME Perú

Mesa del amor y odio

Mesa del amor y odio

GNOME Perú

GNOME Perú

Comparte y disfruta:

Tambien te puede interesar

» Leer más, comentarios, etc...

MadeInFlex

Disponibles las betas de AIR 2 y Flash Player 10.1

Noviembre 17th, 2009

Esta noche se han hecho públicas las betas de AIR 2 y de Flash Player 10.1 en Adobe Labs. Es la primera vez que simultáneamente se publica una versión de runtime para Desktop (AIR) y para browser (Flash Player), además disponible para las tres plataformas (Mac, Windows y Linux) .

Comentemos un poco las mejoras en ambos productos:

Flash player 10.1

Se han añadido nuevas APIs y optimizaciones que nos aportan muchos beneficios. Destacamos entre otras:

Para mitad del 2010 se esperan otras mejoras que ya iremos comentando.
Otra particularidad de Flash Player 10.1 es la optimización. Según Adobe es muy importante, ya que sin tener que añadir código extra, se experimenta un mejor rendimiento. En la imagen siguiente podemos ver una comparativa con la versión anterior de Flash Player:

flash_player_mem_footprint

AIR 2.0

Muchas mejoras aporta esta nueva versión del runtime. Podemos destacar:

No están citadas todas las características de ambos productos, si quereis verlas todas, podeis ir a Adobe Labs donde podreis consultarlas y descargar los runtimes y SDK's.

Iremos informando al respecto.

» Leer más, comentarios, etc...

Cerebro en la Sombra » Técnico

Liberar modem 3G Huawei E220 de Vodafone

Noviembre 16th, 2009

Facilísimo. Y de paso, al actualizar el firmware, lo dejamos preparado para soportar 7,2Mbps. Este es un proceso delicado ya que si se corta a mitad la instalación del firmware se pierde el modem para siempre, hazlo bajo tu responsabilidad. Hay muchos sitios por ahí donde lo cuentan, yo os lo resumo :) .

Desinstalamos completamente el software de Vodafone (o de cualquier otra operadora) y descargamos dos paquetes de actualización, el del firmware en sí mismo y el del software del del modem, ya que no queremos que siga cargando los de Vodafone.

Yo me quedo con el Partner, me parece más sencillo e intuitivo.

Además necesitarás el Qmat (QC Mobile Analysis Tool) y esto otro.

El procedimiento es muy simple. Conectas el modem y cancelas la instalación de los drivers. A continuación ejecutas los dos archivos de actualización, firmware y software. Entre uno y otro (y al terminar el segundo también) conviene desconectarlo y volver a conectarlo (cancelando nuevamente la instalación de los drivers de Vodafone). Ya casi hemos terminado :P .

Instala ahora el Qmat y ejecútalo. En el menú superior ve a Hardware Forensics y Use Mobile Ports.

forensics

En la ventana que aparece seleccionas, en el primer combo, el puerto donde está tu modem, no tiene pérdida, pondrá algo parecido a COMxx – HUAWEI Mobile Connect – 3G PC UI Interface (COMxx). Pulsas en “Send” y deberían salir unos números en la caja de texto de abajo, eso quiere decir que se comunica correctamente con el modem.

En el combo que muestro desplegado en la imagen de abajo seleccionas “Display NVItem” y a la izquierda, en “Item” introduces 1156 y pinchas en “Let’s go“. Si todo va bien en la ventana de texto aparecerán unos números y, al final de todo, un código de 6 a 8 cifras, ése es tu código de desbloqueo. Cópialo. Si tienes algún problema prueba a desconectar el modem y volver a conectarlo o, incluso, a instalar los drivers nuevos cerrando el programa cuando arranque.

qcAhora vamos a la última utilidad, al CardLock_UnLock. Lo abres y te identificará el IMEI de tu teléfono. Pegas en la caja de texto el código que obtuviste en el paso anterior y voilà, el modem está liberado.

unlockLo he probado hoy mismo con SIM’s de Orange y Movistar, aunque la idea es utilizarlo con la de Simyo :) . La configuración que hay que utilizar en este último caso es la siguiente:

partner

APN: gprs-service.com
Usuario: (vacío)
Clave: (vacío)
Número: *99***1#

Ya podemos utilizar el modem con la operadora que nos venga en gana.

Como última curiosidad veremos cómo dejar el software en castellano ya que la actualización lo deja en inglés y no podemos modificar los archivos de la memoria del modem. Editamos el archivo C:\Program Files\Mobile Partner\RunInfo.ini de manera que donde pone:

[language]
active=_en-us

ponga

[language]
active=_es-es

Listo!

» Leer más, comentarios, etc...

Developing my life » desarrollo

Encuentro Linux y Dia GNOME 2009

Noviembre 16th, 2009

Este 21de octubre pasado tuve la oportunidad de viajar a Chile auspiciado por la fundacion GNOME al Encuentro Linux 2009 para participar en el Dia GNOME 2009 y dar una charla con Sergio Infante sobre “Como volverse un Hacker Feliz de GNOME”, donde dariamos diversos medios con que se cuenta para colaborar con el proyecto GNOME y volverse un desarrollador activo.

Participantes auspiciados por la Fundacion GNOME

Participantes auspiciados por la Fundacion GNOME

Desde que llegamos a Chile nos atendieron muy bien y pude conocer a gente muy entusiasta y sobre todo activa con el software libre, gente muy divertida y amiga, los nerds tambien somos divertidos :D ; personas como Miguel Ruiz, Chistian Barahona, Sven von Brand, Alvaro Olivares, Naty Espinoza, Priscilla Cruz, Juan Carlos Hinostrosa, Ivan Frade, Pedro Villavicencio, German Poo, Fernando San Martin, Alejandro Valdez, Jorge Bustos, Ricardo Fuentes,Fabian Aria, Felipe Besoain y Carlos Rios Vera … disculpen si me olvide algun nombre :P

Gigantografia GNOME

Gigantografia GNOME

En el Dia GNOME todos los nomos pusimos el hombro para que los asistentes al evento estuvieran los mas felices posible y se logro el objetivo \o/. Ademas estoy muy contento con lo que pude ver y aprender de todos los nomos que conoci, esto me ha entusiamado mucho para seguir trabajando y convertirme en desarrollador oficial de GNOME y tener mi @gnome.org :) , muchas gracias a todos los nuevos amigos que conocí =)

Asistentes Dia GNOME 2009

Asistentes Dia GNOME 2009

Es todo por este post, nos leemos! :D

Tambien te puede interesar

Comparte y disfruta:

» Leer más, comentarios, etc...

avemundi, blog de un micro-isv » Desarrollo de software

my tools of the trade - windows edition

Noviembre 15th, 2009

Vía Joel on Software llegué al blog de UCOSP donde me llamó la atención el post My tools of the trade. Es una lista de aplicaciones preferidas a la hora de programar, y hay varios enlaces a otros blogs de programadores donde dan cuenta de sus preferencias, entre ellos Mike Gunderloy que es un antiguo evangelista de .Net que se ha pasado al bando de Ruby on Rails, haciendo una pirueta realmente espectacular. Estas listas de aplicaciones favoritas me gustan porque siempre aparece alguna aplicación cuya existencia desconoces y que te puede resultar interesante utilizar.

Como la lista de aplicaciones se hace en un entorno de desarrollo profesional, voy a hacer la mia para entorno Windows. Realmente en Mac todavía no he hecho nada serio, y reconozco que la programación en entorno Mac es mi asignatura pendiente. Aqui va mi lista de herramientas.

En cuanto a hardware, utilizo un iMac de 17″, el modelo de principios de 2007, con 2GB de RAM y disco de 250GB. El teclado que venía con el iMac no me gustaba y tuve la suerte de que me regalaron un teclado de aluminio, y puedo decir que es el teclado más cómodo que he usado en mi vida. El ratón es el Mighty Mouse de cable que venía de serie. Además uso un disco duro externo Lacie para hacer copias de seguridad y un lapiz USB de 4GB. Tengo Windows XP instalado en una partición del disco mediante BootCamp y me va de cine. Intento no instalar aplicaciones para probar en este Windows, sino que uso una máquina virtual con VirtualBox con otro XP donde hago todas los experimentos que no me atrevo con el de trabajar.

Software de desarrollo xBase:

Otro software:

Cada vez uso menos programas. Antes me pasaba el día probando aplicaciones, pero cada vez hago esto menos. Hace mucho tiempo que no instalo nuevo software en Windows, simplemente no lo necesito y me apaño con lo que tengo. Cosas del decluttering.

Hasta aquí el software que uso en Windows. A ver si los lectores del blog os animais a hacer un post similar y publicais el enlace en los comentarios.

» Leer más, comentarios, etc...

Fetishcode...Thinking in objects

Planes sobre el catalogo de productos de Sun

Noviembre 13th, 2009

A

» Leer más, comentarios, etc...

Buayacorp

Wordpress 2.8.6

Noviembre 13th, 2009

Liberada una nueva actualización de WordPress la 2.8.6 que soluciona dos problemas de seguridad.

» Leer más, comentarios, etc...

xailer.info (esp)

Xailer 2 RC2

Noviembre 13th, 2009

Estimados usuarios de Xailer,

Ya está disponible la segunda RC (release candidate) de Xailer 2, en la cual básicamente se han corregido pequeños errores encontrados en la RC1.

Para más información acerca de Xailer RC consulte el artículo siguiente:

http://xailer.info/esp/?p=225

Podéis encontrar la nueva versión de Xailer 2 RC2 en el siguiente enlace:

http://www.xailer.com/files/xailer20rc2.exe

También deberéis descargar una nueva versión de los binarios de xHarbour, que ha cambiado desde la anterior publicación, desde la siguiente dirección:

http://www.xailer.com/files/xharboursetup2.exe

Os recordamos que está versión de Xailer sólo está disponible para usuarios con suscripción activa. Leer el artículo Novedades de Xailer 2.0 para más información.

Nota Importante:

Hemos decidido prorrogar el periodo de soporte y actualizaciones de forma completamente gratuita hasta 30 días después de la publicación definitiva de Xailer 2.0 a todos aquellos usuarios que hayan comprado o renovado Xailer después del día 10 de Agosto de 2008, fecha en la que se publicó en nuestro Blog el acceso a Xailer 2.0 Beta por parte de los usuarios con suscripción activa.

Si este es su caso, póngase en contacto con sales@xailer.com para que se le amplíe la fecha de soporte.

Un cordial saludo,

[El equipo de Xailer]

» Leer más, comentarios, etc...

4 bits blog

Autotools

Noviembre 13th, 2009

Si alguien sabe lo que son las autotools, seguramente haya sufrido para saber cómo funcionan. Hacía mucho tiempo que no me peleaba con ellas, hasta que hace unos días leí un pequeño manual sobre cómo configurar los diferentes archivos necesarios y me acordé de un pequeño manual que hice cuando me tocó pegarme con ellas, que voy a recuperar.

¿Qué son las autotools?

Las autotools, son programas que se usan para crear un paquete de código fuente que se pueda distribuir y compilar de una manera sencilla (configure, make y make install). Los programas que forman las autotools son los siguientes:

Estos programas son la base para crear el paquete de código fuente, para ello se tendrán que generar unos archivos concretos.

Estructura del código fuente a distribuir

Las autotools se usan para generar el paquete «tar.gz» que contiene el código fuente del programa que se va a distribuir, normalmente estos paquetes siguen una estructura estándar. La estructura básica es:

De este modo, si se van a utilizar las autotools sería aconsejable seguir la estructura anterior, y crear todos los archivos menos los como «autogenerado» que, obviamente, se generarán automáticamente, aunque siempre se pueden crear a mano ya que puede que no se quiera tener el contenido autogenerado.

El archivo «configure.ac»

Sobre este archivo gira toda la generación del programa para su distribución. En él se escriben las macros para los diferentes programas que se ejecutarán: aclocal, autoconf y automake.

AC_PREREQ(2.52)
AC_INIT([hola mundo], [0.1])
AM_INIT_AUTOMAKE([])

AC_PROG_CC
AC_CONFIG_FILES([Makefile src/Makefile])
AC_OUTPUT

Aviso: Las macros no pueden llevar un espacio entre su nombre y el paréntesis de inicio.

Los archivos «Makefile.am»

Los archivos «Makefile.am» contienen las reglas para generar los archivos «Makefile» correspondientes a los directorios dónde se encuentran, por lo que habrá un archivo por directorio en el que se tenga que realizar alguna operación con make.

De este modo, siempre se debe tener un archivo «Makefile.am» en el directorio raíz del proyecto, este archivo contendrá algo similar a lo siguiente:

SUBDIRS = src
EXTRA_DIST = AUTHORS ChangeLog NEWS README THANKS TODO

En este caso el directorio «src» es dónde, supuestamente, deberá estar el código fuente de nuestra aplicación y tendrá un archivo «Makefile.am», que indicará las reglas para compilar nuestro código fuente correctamente.

El archivo «Makefile.am» tendrá el siguiente contenido:

bin_PROGRAMS = hola−mundo
hola_mundo_SOURCES = hola−mundo.c

Nota: Para generar una biblioteca, se debería usar libexec_PROGRAMS en lugar de bin_PROGRAMS.

Generación del script «configure»

Una vez creados los archivos necesarios, se deben realizar los siguientes pasos:

  1. Generación:
    $ aclocal
    $ autoconf
    $ automake −−add−missing
  2. Compilación y ejecución del programa:
    $ ./configure
    $ make
    $ src/hola−mundo
  3. Distribución del programa:
    $ make distcheck

Para ampliar un poco más All you should really know about Autoconf and Automake

» Leer más, comentarios, etc...

Cerebro en la Sombra » Técnico

Google Safe Browsing API con PHP, filtra las urls potencialmente peligrosas

Noviembre 13th, 2009

Preparando un pequeño nuevo proyecto del que os hablaré en mi siguiente artículo, tuve un problema que me llevó a escribir este otro. En un momento de la aplicación el usuario debe escribir una url (el resto es secreto aún :P ). Pues bien, ya durante las pruebas aparecieron los típicos graciosos que utilizan url’s potencialmente peligros, de esas que no hacen cosas nada buenas. Buscando un poco dí con Google Safe Browsing API, el sistema que Google pone a nuestra disposición para comprobar contra sus sistemas si tienen una determinada url recogida dentro de su base de datos de urls peligrosas, la misma que utilizan ellos para lanzar a veces esos avisos de “¿seguro que quieres ver esto?”.

Esta API funciona de modo diferente a la mayoría de aplicaciones de Google que residen directamente en la nube y lanzamos consultas contra su API. En este caso nos provee de su base de datos de urls potencialmente peligrosas para que las guardemos localmente y hagamos las consultas directamente en nuestros sistemas, lo único que debemos hacer es actualizar periódicamente esos datos, eso sí, con algunas limitaciones que nos impone Google, como que no se pueden renovar en intervalos inferiores a 30 minutos. Actualmente esta base de datos tiene más de trescientos mil registros.

Vamos a explicar como utilizarla. Lo primero que debemos hacer es, como en todo lo que hace Google, crear una “API KEY” y una sencilla tabla en nuestro servidor MySQL donde alojaremos la información que nos envíe Google.

  1. CREATE TABLE IF NOT EXISTS `malware` (
  2. `malware_hash` varchar(32) NOT NULL,
  3. PRIMARY KEY  (`malware_hash`)
  4. ) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Creamos ahora una tarea que se ejecutará periódicamente y que leerá, siguiendo las especificaciones adecuadas, los datos que devuelve Google y los insertará/eliminará de nuestra base de datos. Yo, como ya he comentado en otras ocasiones, utilizo Adodb para el acceso a datos.

  1. include(dirname(dirname(__FILE__))."/includes/funciones.inc.php");
  2.  
  3. $api_key = "TU KEY";
  4. $google_url = "http://sb.google.com/safebrowsing/update";
  5.  
  6. //open the remote URL
  7. $target = "$google_url?client=api&apikey=$api_key&version=goog-malware-hash:1:-1,goog-black-hash:1:-1";
  8.  
  9. $handle = fopen("$target", ‘r’)
  10.     or die("Couldn’t open file handle " . $target);
  11. if ($handle) {
  12.     while (!feof($handle)) {
  13.         $line = fgets($handle);
  14.         if (substr($line,0,1) != ‘[’) {
  15.             $operation = (substr($line,0,1)); //get the ‘+’ or ‘-’
  16.             $hash = trim(substr($line,1)); //get the md5 hash
  17.             $hash = qstr($hash); //escape
  18.             if ($operation == ‘+’){
  19.                 $sql = "insert ignore into malware (malware_hash) VALUES (’".$hash."’)";
  20.                 $conn->Execute($sql);
  21.             }else{
  22.                 $sql = "delete from malware where malware_hash = ‘".$hash."’";
  23.                 $conn->Execute($sql);
  24.             }
  25.         }
  26.     }
  27.     fclose($handle);
  28. }

Lo que hacemos simplemente es eliminar los hash que nos indica que debemos quitar y añadir los nuevos. Vamos a probar el sistema. Utilicé varias clases y sistemas que había por ahí para utilizar con PHP pero ninguno me parecía lo suficientemente completo hasta que encontré este. Su funcionamiento es muy sencillo. De nuevo está hecho usando Adodb, cámbialo según tus requerimientos.

  1. $class = new GoogleSafeBrowsing(‘tu_key’, true);
  2. $safe=$class->lookupsFor("http://blog.osusnet.com");

Nos devolverá un booleano que indica si la url es segura o no. Si probamos con alguna de éstas obtendremos un bonito false :) . Espero que os sirva.

» Leer más, comentarios, etc...

Ingenieria de Software / Software Engineering

Project Server 2010 : Portfolio Analysis

Noviembre 13th, 2009

Mas de Project Server 2010 desde el Team Blog de Microsoft Project, Porrtfolio Analysis entre otras características están las siguientes;

 

http://blogs.msdn.com/project/archive/2009/11/11/project-2010-introducing-portfolio-analysis.aspx

» Leer más, comentarios, etc...

Buayacorp

Pruebas de compatibilidad en navegadores

Noviembre 12th, 2009

Probando tu diseño en todos los navegadores.

» Leer más, comentarios, etc...

MadeInFlex

Usabilidad en la interacción persona – aplicación

Noviembre 11th, 2009

Una de las últimas asignaturas que cursé en la carrera y una de las más importantes desde mi punto de vista, trataba sobre interficies de usuario. Agradezco al profesor Jordi Regencós, un experto en este ámbito, que me haya permitido usar sus apuntes para este artículo.
A los developers de aplicaciones, en especial a nosotros, los desarrolladores de RIA's, nos tiene que sonar el concepto de usabilidad, para los que no, me complace compartir con vosotros este post.

Introducción

A menudo se piensa que sólo el buen diseño de una aplicación hará que ésta sea atractiva; y no es así: si ésta no es usable, el usuario acabará por aborrecerla, por muy bueno que sea el diseñador.

La usabilidad se define en la wikipedia como la facilidad con la cual las personas pueden utilizar un objeto con el fin de alcanzar un objetivo concreto. La usabilidad también puede referirse al estudio de los principios que hay tras la eficacia percibida de un objeto.

En el ámbito de la interacción persona - aplicación, la usabilidad se refiere a la claridad y la elegancia con que se diseña la interacción con una aplicación. No debemos confundir la usabilidad con la experiencia de usuario: están relacionadas de alguna forma, pero no son lo mismo, ya que la experiencia de usuario se refiere al conjunto de factores y elementos relativos a la interacción del usuario, con un entorno o dispositivo concretos, cuyo resultado es la generación de una percepción positiva o negativa de dicho servicio.

La usabilidad tiene en cuenta estos aspectos:

Los conceptos de usabilidad y de modelo de interacción persona / aplicación están relacionados, ya que el grado de usabilidad facilitará o no esta interacción.

Interacción persona / aplicación

Hay distintos estilos de interacción entre persona y aplicación, pero todos quedan reflejados en el siguiente diagrama:

usabilitat

En el diagrama anterior se describe la interacción como un proceso cíclico que sigue las siguientes etapas:

1- El usuario introduce datos mediante un dispositivo de entrada.
2- El dispositivo de entrada envía datos a la aplicación para que ésta realice una acción en el sistema.
3- La aplicación da una respuesta a la acción solicitada y refleja los cambios en el dispositivo de salida, el más común es el monitor.
4- El usuario interpreta la salida como resultado a la acción solicitada.

En el diagrama se observa que hay dos conceptos que pueden sorprender, los precipicios de ejecución y de evaluación. Vamos a explicar a continuación en que consisten.

Precipicios de ejecución y evaluación

El concepto de precipicio de ejecución se define como la dificultad que tiene el usuario para traducir las intenciones en acciones sobre el sistema. Por ejemplo, en una web de compras online, sería la dificultad que encuentra para tomar cada decisión sobre el sistema que le llevará a comprar un producto.

En cambio, el precipicio de evaluación se define como la dificultad que tiene el usuario para decidir si las acciones que ha realizado sobre el sistema han servido para conseguir sus objetivos, en función de la interpretación de la respuesta que la aplicación da sobre el dispositivo de salida. Siguiendo con el ejemplo anterior, sería la dificultad que tiene el usuario para ir entendiendo los diferentes estadios del proceso de compra a partir del feedback de la aplicación.

Se considera que cuanto mayores son estos precipicios peor usabilidad tiene la aplicación; por lo tanto, uno de los objetivos de la interficie gráfica debe ser reducir al máximo estos precipicios.

Beneficios de la usabilidad

Los más destacados son:

Principios básicos del diseño centrado en la usabilidad

Entre la multitud de expertos en usabilidad, me gustaría destacar a Donald A. Norman , ya que considero que los principios que difunde, son principios esenciales y universales que definen un buen diseño para conseguir una mejor usabilidad. Sus principios son:

Principios de la usabilidad

Jakob Nielsen es considerado el creador del concepto de usabilidad. Él la definió como “atributo de calidad que mide lo fáciles de usar que son las interfaces”; es decir una aplicación usable es aquella en la que los usuarios pueden interactuar de la forma más fácil, cómoda, segura e inteligentemente posible.
Jakob Nielsen dijo que es muy importante que una interfaz sea entendible, novedosa, comprensible, inteligente y atractiva.

Además definió sus propios principios de usabilidad que a continuación enumero:

Para concluir…
Para los que no vean la importancia de la usabilidad, decir que está reconocida como un importante atributo de calidad del software, habiéndose ganado un espacio entre aspectos más tradicionales como el rendimiento y la fiabilidad. De hecho ya se habla de ingeniería de la usabilidad. En los últimos tiempos han surgido muchas consultorías sobre usabilidad debido a la importancia que ha adquirido.
Para finalizar, si os interesa el ámbito de la usabilidad, os recomiendo que leais a Nielsen y a Norman; podeis encontrar información en la página web de su consultoría de usabilidad la Nielsen Norman Group.

» Leer más, comentarios, etc...

Información legal y técnica