miércoles, 18 de julio de 2012

Distancia de edición

adminitrador: Saludos User123
user123: Saludos
adminitrador: disculpe por las molestias, pero lamento informaros que nuestra base de datos ha sido comprometida y por lo que parece, por una persona de nuestro equipo.
user123: Lo lamento, pero y  ¿por qué me estás diciendo eso? no tengo nada que ver con lo que ha sucedido.
adminitrador: estamos llevando una investigación a fondo, y como se podrá . . .

¡Espera un momento! ¿Quién diablos es ese? ¡administrador sin s!

Bueno, sin duda ese era alguien un poco más astuto de la cuenta, y estoy seguro de que hubo personas que no pudieron percibir ese pequeño detalle mientras leían la parte de arriba.

El robo de identidad es algo muy común en la red y muchas veces es muy fácil de llevar a cabo, veamos como podemos proteger a los usuarios y nuestra web, en lo posible, de este tipo de cosas utilizando la distancia de edición de Levenshtein, o simplemente distancia de Levenshtein:

Antes de comenzar, necesitarás la siguiente gema:
gem install levenshtein
Continuando, según el ejemplo del timador de arriba, para nuestros fines, consideraremos insegura cualquier palabra que necesita dos o menos cambios para convertirse en otra.

Primero probemos un poco con irb:
irb(main):001:0> require 'levenshtein'
=> true
irb(main):002:0> Levenshtein.distance("administrador", "adminitrador")
=> 1
irb(main):003:0> Levenshtein.distance("webmaster", "wepmaster")
=> 1
irb(main):004:0> Levenshtein.distance("administrador", "administradores")
=> 2
irb(main):005:0>
Viendo los resultados, podríamos concluir que si tenemos un usuario de nombre webmaster, sería inseguro aceptar otro usuario de nombre wepmaster, de la misma manera para: administrador y adminitrador; administrador y administradores.

Preparemos ahora otro ejemplo, pero esta vez uno que lea una lista de usuarios y de ellas nos diga si es seguro aceptar el usuario o no.
require 'levenshtein'

RULE= 2

def safe_name?(pool, username, rule=RULE)
     not pool.any? do|name|
          Levenshtein.distance(name, username) <= rule
     end
end

if ARGV.empty?
     $stderr.puts "Uso: ruby #{$0} <usuario>"
     exit
end

# pool = IO.read('lista_usuarios.txt').scan(/\w+/)

pool = %w{ administrador abogado policia admin webmaster
           paypal google yahoo amazon dios jesus gandhi}

if safe_name?(pool, ARGV[0].downcase)
     puts "El nombre de usuario `#{ARGV[0]}' es seguro."
else
     puts "`#{ARGV[0]}' no es un nombre de usuario seguro."
end

~ $ ruby edit_distance.rb googel
`googel' no es un nombre de usuario seguro.

$ ruby edit_distance.rb jesu
`jesu' no es un nombre de usuario seguro.

$ ruby edit_distance.rb gandi 
`gandi' no es un nombre de usuario seguro.
                                        
~ $ ruby edit_distance.rb abogados
`abogados' no es un nombre de usuario seguro.

Conclusión

Últimamente los entornos de trabajo modernos (frameworks) integran mecanismo como este, de modo que la responsabilidad de comprobar este tipo de cosas recae en el sistema y no en el programador, pero nunca está de más estar alerta y consciente de los lugares de entrada y la forma de tapar esos huecos.

Ya con esto haremos que nuestros usuarios estén un metro más lejos de las garras de personas malintencionadas y brindaremos una capa más de seguridad a nuestra aplicación. Para aquellos que utilicen PHP en vez de Ruby, buenas noticias, PHP incluye en su librería estándard la función levenshtein() .

Enlaces Útiles

domingo, 15 de julio de 2012

Esteganografía: El canal alfa

¿Has sentido la necesidad de pasar información a través de un canal público? ¿Has sentido la necesidad de no levantar sospechas? o solo quieres ocultar información, sea cual sea tú fin, en esta entrada encontrarás un programa que te será muy útil así como la descripción de una técnica relativamente práctica que utiliza imágenes para ocultar información.


Ocultando información

Debido a  que a muchas personas no les interesa la teoría detrás de esta técnica, he comenzado por la parte práctica, la cual es de interés común.

Necesitarás:
  •  Ruby
  • El código del programa, descargar AQUÍ
  • Instalar la gema ChunkyPNG
    gem install chunky_png
  • La siguiente imagen para seguir los ejemplos al pie:


Primero veamos las opciones que nos proporciona el programa con la opción --help y de camino veamos también que espacio de almacenamiento tenemos disponible en la imagen.
Bueno, a simple vista se puede ver que el programa nos ofrece muchas opciones útiles para manipular la imagen, y también nos muestra que tenemos apróx. 145 KB de espacio útil dentro de la imagen.

Ahora veamos como se oculta y revela información dentro de la imagen

También podrías — si el texto es muy grande — especificar un fichero completo y ocultarlo dentro con la opción --file, o podrías también si consideras que la información dentro de la imagen es muy grande, volcarla en un fichero, con la opción --output-file. Veamos

¿Cómo funciona?


Antes que nada aclaremos unas cosas, por ejemplo el título de la entrada:

 ¿Qué es la esteganografía?
es la parte de la criptología en la que se estudian y aplican técnicas que permiten el ocultamiento de mensajes u objetos, dentro de otros, llamados portadores, de modo que no se perciba su existencia. Wikipedia
Es preciso aclarar, que la esteganografía y la criptografía van de la mano pero el fin de ambas es diferentes. La esteganografía falla cuando se descubre la presencia de información oculta dentro del portador, aún si esta está cifrada. La criptografía falla cuando el sistema de cifrado falla.

Para mas información visita wikipedia.

El canal alfa

Ya a estas altura de juego ya muchos de ustedes estarán familiarizado con la representación hexadecimales de los colores en la web, por ejemplo dos colores muy comunes y que posiblemente sabes son el blanco #FFFFFF y el negro #000000. Para el que no lo sepa, esas representaciones son números, números que indican la cantidad de ciertos colores preestablecidos, los cuales son: Rojo, Verde y Azul. De ahí su nombre, colores RGB.

Continuando, para representar dichos colores se necesitan 3 bytes, en cierta forma un byte por cada dos dígitos hexadecimales de ahí la decisión por adoptar la representación base dieciséis, es mucho fácil de recordar. Ahora, imagina que preparas una imagen y has seleccionado un color, pero pasa algo, sucede que es un color muy intenso y quieres darle un poco de opacidad — que se vea algo transparente — ¿Cómo lo logras? ¡pues con el canal alfa!

El canal alfa es un cuarto byte A dentro de la representación numérica del color RGB de un píxel y representa la opacidad que este tiene. Cuando se utiliza el canal alfa, el píxel se denomina por el cuarteto RGBA — Un píxel es, por así decirlo, un punto de color dentro de la imagen  — .

— ¿Qué pasaría si decidiera darle total opacidad a un píxel?
— Pues simple, conseguirías un píxel trasparente.
— Un píxel transparente es un píxel invisible ¿no?
— exacto.

De  forma resumida, para ocultar información dentro de una imagen con canal alfa, solo tendríamos que insertar la información en el espacio RGB de un píxel y ocultarla dándole total opacidad con el canal alfa ... solo eso ...

Debilidades

Esta técnica presenta una debilidad y es que cualquier persona podría poner visibles todos los pixeles transparentes de una imagen y ver una evidente anomalía en la imagen. Veamos como se logra esto con el programa de la entrada y la opción --show-alpha:

y el resultado es el siguiente:


Conclusión


Aquí no está, quizás esté en otra parte :P

 Referencias


Este artículo está  basado en otro escrito por Daniel Lerch en su extraordinario blog.

Enlaces de interés