Archive for the ‘Historico’ Category

[Componente] Mouse Gestures para Flash

Viernes, Octubre 7th, 2005

Hace algún tiempo que escribí esta clase para Flash inspirado por la genial funcionalidad includia en el navegador Opera. Incluso tuve la oportunidad de presentarlo en las charlas de Subflash este verano. Por fín he podido sacar el tiempo necesario para documentarlo debidamente (no me gusta publicar nada que no lo esté), empaquetarlo y mejorar los ejemplos.

La clase sirve para observar los trazos del ratón generados por el usuario y así asociar ciertas acciones a ellos. Bueno, pienso que lo mejor es que le hecheis un vistazo al tema, asi que aquí lo teneis:

Mouse Gesture Manager Class

Espero que le encontreis utilidad.

Problemas con IE (para variar)

Miércoles, Septiembre 7th, 2005

Que impedian ver esta página. Solucionado, un script, amigo de un bug, que conocia de antes al service pack 2 se vé que no le gustaba el alto de mi pagina.

¿No lo entendeis? Yo tampoco.

Flash y criptografía: Técnica de ocultación de información en cliente.

Martes, Agosto 30th, 2005

Otra vez de nuevo por aquí con una técnica que creo que muchos pueden encontrar interesante. En un trabajo reciente para un cliente, este quería colgar en una web en Flash unos archivos que solo se pudieran descargar con password. Hasta aquí nada peculiar excepto por el hecho de que el servidor no soportaba lenguaje de servidor, además pedirlo solo para eso me parecía exagerado. Así que como últimamente he estado trabajando un rato con el tema de encriptación le he estado dando vueltas para conseguir un sistema que aunque no fuese infalible (ninguno lo es) evitase los casos mas probables de ataque, como la decompilación del SWF e incluso temas mas complicados como algún sniffer.

Seguro que alguno me cuenta que este sistema ya lo conocía, que es trivial, pero la criptografía es un tema de lo más oscuro para muchos. Vamos, lo era para mí hasta que me tuve que meter de lleno por un proyecto que requería especial tratamiento en la seguridad.

Por explicarlo rápidamente y muy por encima digamos que hay 2 tipos de algoritmos:

  • Los de vía única, no reversibles, comúnmente llamados algoritmos de hash, que tienen 2 características que son muy útiles:
    • Una vez cifrado el texto, no se puede descifrar, no hay vuelta atrás.
    • Y que es prácticamente imposible que usando dos textos diferentes se obtengan el mismo hash. Los más conocidos son MD5 y SHA-1.

    Actualización: Xabi Beumala me comenta:

    Los algortimos reversibles se separan en dos grandes grupos, los simétricos y los asimétricos. En los simétricos la llave es la misma en ambos extremos (encrypt y decrypt), en los asimétricos tienes dos llaves una deshace a la otra.

  • Los reversibles, seguramente los mas conocidos por todos. Tienes una palabra clave que usas para cifrar el texto y esa misma clave sirve para revertir el texto. Hay muchos de este tipo, pero los más conocidos son los RSA y AES.

Antes de comenzar os tenéis que bajar unas clases de crypto que resuelvan la parte engorrosa del asunto: Implementar los algoritmos. Os recomiendo las ASCrypt que tiene todo lo que necesitamos. En el ejemplo usaremos estas, aunque hay otras como ActionCrypt

Para poner en práctica esta técnica que os cuento no nos valdría solo con este ultimo tipo ya que de alguna manera deberíamos incluir la clave en los datos del SWF o se tendría que trasmitir desde el servidor lo que haría el sistema bastante débil. Necesitamos una combinación de los dos.

El escenario es el siguiente. Pensamos en una palabra clave, esta es la que le vamos a dar a los usuarios que queremos que tengan acceso. Pongamos que es "privado". OK

Previamente calculamos el Hash usando SHA1 (por ejemplo) y copiamos el hash que hemos obtenido, que seria "7e4231b4e1b8534ea5106bf821f0bb324987c567" y en Flash simplemente comprobamos si el usuario es válido con un simple if:

Actionscript:
  1. import com.meychi.ascrypt.*;
  2. var logged:Boolean = false;
  3. var key:String;
  4. function validate(pass:String):Boolean{
  5. if(SHA1.calculate(pass)== "7e4231b4e1b8534ea5106bf821f0bb324987c567"){
  6. logged = true;
  7. key = pass;
  8. return true;
  9. }
  10. return false;
  11. }

Lo interesante aquí es que da igual que vean el texto cifrado (hash) porque no es posible revertirlo para ver la clave original :) así que aunque vean el código fuente es prácticamente imposible obtenerla.

Fijaros también que guardamos la clave que ha introducido el usuario en la variable "key", esta la vamos a utilizar en el paso siguiente. Ahora imaginaros que la url que queremos ocultar es: "/ficheros/documento.pdf". Ahora utilizaremos un algoritmo reversible, un AES, también conocido como Rijndael. De nuevo generamos el texto cifrado para esa url usando como clave "privado" la misma que hemos hasheado con el SHA1 y nos devolverá lo siguiente: "3e3b9304a675c7fb24be775d4aee65962118be8080270e618204093773374004", perfecto, de nuevo nos vamos a Flash y utilizamos la variable "key" donde hemos almacenado la que ha introducido el usuario para desencriptar ese churro y obtener la url original:

Actionscript:
  1. var codec:Rijndael = new Rijndael(192, 128);
  2. function decryptfile(crypto:String):String{
  3. return codec.decrypt(crypto, key, "ECB");
  4. }
  5. descargar.onRelease = function(){
  6. if(logged){
  7. getURL(decryptfile("3e3b9304a675c7fb24be775d4aee65962118be8080270e618204093773374004"),"_blank");
  8. }
  9. else{
  10. trace("No permitido");
  11. }
  12. }

De esta manera ya tenemos protegido el nombre del fichero. Y es prácticamente imposible obtenerlo sin conocer la clave. Creo que winzip, winrar .etc. utilizan un sistema parecido para proteger los ficheros.

Este sistema tiene algunas pegas, una de ellas es el hecho de la clave se tiene que proporcionar previamente al usuario de alguna manera, ese método puede ser inseguro (como el email común) y ahí estaría el talón de Aquiles del sistema. Otro inconveniente es que el hecho de cambiar la clave obliga a generar de nuevo el hash y todos los textos cifrados, pero esto se podría aliviar manteniéndolos en un XML externo y actualizándolo cuando esta cambiase. Incluso se podrían cargar diferentes basándose en un nombre de usuario o email.

Bueno, espero que os sea útil esta técnica. Admito todo tipo de comentarios al respecto, no soy un experto en criptografía ni mucho menos, pero creo que el sistema en sí tiene una fiabilidad bastante alta.

Aquí os cuelgo el fichero de ejemplo y un generador de claves para crear el hash y las urls cifradas. Merece la pena que leáis sobre el tema, si quitas los detalles de implementación, el resto es bastante interesante ;)

[Articulo] Data Binding con Movieclips

Sábado, Mayo 14th, 2005

Hacía tiempo que no posteaba nada en el blog, no es la excusa de "mucho trabajo", simplemente es que si no hay nada interesante que decir, pues mejor no decir nada.

Sin embargo, trás el webminar del otro día y trás uno mensaje de ASNativos, estube investigando un tema que me pareció lo suficientemente interesante como para escribir un artículo. Así que aqui lo tenéis.

DataBinding con Movieclips

Espero que os sea útil.

NeoSwiff Public Beta. Todo para Flash, pero sin Flash.

Jueves, Abril 7th, 2005

Acabo de ver esto publicado en varios blogs y me he quedado alucinado. Los que me conocen saben que soy un enamorado de C#. Pues esto me ha parecido un sueño hecho realidad.

Todavia no he tenido tiempo de ponerlo a prueba, me lo acabo de descargar y ahora mismo estoy metido en uno de esos deadlines que no te dejan tiempo ni para comer asi que lo que os cuento aqui es lo que he leido en diferentes blogs.

Parece que esta gente de NeoSwiff ha creado no solo un compilador C# a SWF sino que practicamente soporta todo el lenguaje. Se integra con Visual Studio, soportando el famoso Intellisense y la ayuda integrada. Por si esto no fuera poco, es compatible con el framework de .NET. Además es capaz de producir errores fatales de ejecución, por ejemplo al intentar usar un objeto no instanciado. Simplemente alucinante.

Por lo que he oido también debe sacar un bytecode muy optimizado, que hace que las aplicaciones "vuelen". No se, hechadle un vistazo vosotros mismos, sin duda es un proyecto del que hay que estar pendiente. MTASC parace un juego de niños comparado con lo que ha hecho esta gente, sin quitarle meritos, por supuesto esta gente también se merece todo mi respeto y admiración.

Existe la alternativa de XAMLON que también las pinta genial. Aunque toma otra aproximación diferente al tema.

Parece que ha llegado una nueva era en la producción de Flash a niveles que jamás nadie se hubiera imaginado con la adopción de ECMAScript en Flash 5. Quien sabe a donde llegaremos, pero seguro que estaremos aqui para averiguarlo.

Cuando tenga un poco de tiempo para poder probarlo a fondo prometo dar más información, esta vez un poco más empirica.

Nuevo meeting 5dms

Lunes, Febrero 28th, 2005

¿Qué mas decir? Asistencia presencial y online. Nuevos ponentes, hasta un sorteo....

ya sabes

OOP con Javascript

Miércoles, Enero 26th, 2005

Hace algun tiempo escribí una utilidad en Javascript para poder implementar algo parecido a la herencia con elementos DOM de Javascript. La he tenido un poco escondida, como otras tantas cosas que comienzo pero que no publico, no porque no me de la gana, sino porque simplemente le falta testeo y/o no esta bien documentado. Bueno, en este caso el script en sí a pasado ya la prueba de 2 proyectos que estan ahora mismo en producción y esta documentado, así que os pongo el enlace. La documentación esta en Inglés, pero si hay interés poner un comentario, no me costaría gran cosa traducirla a castellano.

Object.registerClass para Javascript

En los próximos días mostraré algunas de las cosas que he hecho basado en este pequeño invento.

[Rant] Contra el mal uso del operador ? :

Miércoles, Enero 19th, 2005

Desde hace algun tiempo he visto muchas, muchas veces escrito un codigo parecido a este:


(selection==0)?alert("selecciona alguno"):realizaOperacion();

Normalmente escrito por gente que controla medianamente actionscript. Si, se que funciona, y que cumple lo que el programador en cuestion desea pero hay varios puntos negativos que se deberian de tener en cuenta:

  1. El operador ternario ( ? : ) es un operador de asignacion, no una estructura condicional. Lo que implica que el runtime, el Flash player en este caso, realiza una asignacion aunque en este caso caiga en saco roto. Aunque poco, desperdicia memoria y procesador. Este tipo de cosas son las que cuando menos te lo esperas vuelven para complicarte la vida.
  2. Hace tu codigo mas ilegible. Esto quiere decir que cualquier otra persona que no lo haya usado nunca esa incorrecta manera de establecer una condicional, va a tener que mirarse la linea 2 veces para ver que demonios estas intentando hacer ahi. Al ser un operador condicional la gente espera que haya una asignacion de variable cuando realmente no es eso lo que se quiere hacer.
  3. Va en contra de la extensibilidad del codigo. Si, aunque a un nivel muy bajo, esto es cierto. ¿Qué ocurre si en un momento dado se quieren realizar 2 operaciones bajo la condicional?. Hay que reescribirla.

asi que la proxima vez que querais escribir una accion similar en una sola linea hacerlo de la manera correcta:

if(selection==0)alert("selecciona alguno"); else realizaOperacion();

Son solo unos poquitos caracteres más (menos de 10) y cumplís con el proposito de las instrucciones del lenguaje. De esta manera el mundo sera un poco mas feliz, habra menos guerras, menos hambre, menos violencia, llegará la paz a Irak...esas cosas :)

[Componente] Info ComboBox: Añadiendo un texto en reposo

Martes, Enero 11th, 2005

Bueno, llevo 5 días con un gripazo de muerte en casa y en mi aburrimiento he rescatado este componente que hice hace algunas semanas para un proyecto propio. Basicamente extiende el ComboBox de Macromedia para poder poner un texto informativo en el combo mientras no haya elementos seleccionados.

Extiende la clase mx.controls.ComboBox y añade al interface público la propiedad:


[Inspectable]
public var noSelectionText:String

El combo muestra el texto de esta propiedad mientras la propiedad 'selectedIndex' sea 'null', es decir, muestra un texto informativo siempre que no haya un elemento seleccionado en el combo.

La propiedad noSelectionText es accesible a través de Actionscript y mediante el inspector de componentes en tiempo de diseño.

El componente aparece con el nombre 'Info ComboBox' dentro de la carpeta de UI Components en el panel de componentes junto a los de Macromedia ya que la funcionalidad es casi exacta a excepción de esta propiedad añadida.

Información sobre el uso del Info ComboBox

Podeis descargar la extension y el codigo fuente desde aqui

Si teneis cualquier cosa.... bueno, para eso estan los comentarios ¿no? :)

No estoy muerto, pero casi

Miércoles, Noviembre 17th, 2004

Porque esto lleva abandonado muchos meses. Basicamente por 3 cosas

  1. 5dms
  2. La maquetacion da asco, tiene 3 años y el css es una chapuza-intento-de-webstandards (fue mi primer intento)
  3. Estoy preparando un nuevo blog

Asi que cuando comienze mi nueva etapa como asalariado y deje estea vida penosa de freelance que llevo, se supone que tendre mas tiempo para mis cosas, y os prometo que este blog sera lo primero que haga.

Ni siquiera se si a estas alturas me leera alguien :)