jueves, 25 de diciembre de 2008

Partial matches against an encrypted database in 8 steps

Este es un tópico muy recurrido en muchos foros/blogs y no parece haber una respuesta unánime a cómo realizar querys a una tabla cuyos datos están cifrados. Aquí os escribo mi propuesta personal.
Éste post además va a servir para hacer una pequeña introducción a uno de mis proyectos personales.

El entorno es una aplicación de gestión para una clínica dental, en la que, debido a las restricciones establecidas por la Ley Orgánica de Protección de Datos (LOPD) donde se habla de la seguridad y privacidad de los datos personales de carácter médico, la mayoría de los datos de los pacientes se encuentra cifrada.

A la hora de consultar datos a alguna de estas tablas, surge el problema de realizar una consulta parcial, por ejemplo, obtener un listado de todos los registros cuyo apellido comience por 'A'. La sentencia sql sería de la forma 'select id, nombre, apellido from persona where apellido like 'a%';'. El resultado de esta consulta, suponiendo la tabla persona cifrada, va a ser nulo o inesperado, aunque tengamos registros que cumplen la condición de que su apellido comience por 'A'.

Inmediatamente se ocurre la posibilidad de cifrar, empleando el mismo par algoritmo-clave la condición de búsqueda: 'A' y realizar la consulta nuevamente. De la misma forma que para el caso anterior, el resultado va a ser nulo o inesperado.

Esto es así ya que el resultado de cifrar una cadena 'perro' y una cadena 'perr' no tiene nada que ver. Menos mal, porque sino la fortaleza de los algoritmos de cifrado sería prácticamente nula a los ojos de alguien con cierto conocimiento y paciencia.

Nos encontramos ante la situación de no permitir/soportar consultas parciales, reduciendo a cero el número de usuarios de nuestra aplicación o buscar otra solución.

Aquí propongo la solución de crear una tabla temporal, con el mínimo número de campos (mas el campo clave de la tabla) para satisfacer las condiciones de búsqueda para cada caso particular. Rellenarla con datos en plano extraídos de la base de datos y realizar la consulta sobre esta tabla. Una vez tengamos los identificadores de los registros que sabemos que cumplen las condiciones de búsqueda, extraemos dichos registros de la tabla original (cifrada) y podremos devolver la información requerida.

Un ejemplo práctico:

Sea una tabla persona con los siguientes campos, id (identificador del registro, clave primaria de la tabla), nombre, apellido y teléfono. La información que guarda la tabla está cifrada toda a excepción del campo identificador. Reutilizando la consulta anterior, pongamos que se pide una lista de nombre, apellidos de todas las personas cuyo apellido comience por la letra 'A'. El proceso es el siguiente.

1.- Obtener un nombre único para la tabla, para este propósito podemos obtener un timestamp del milisegundo en que se crea la tabla, o algo por el estilo.

2.- Crear la tabla temporal:
CREATE TEMPORARY TABLE (
id INTEGER PRIMARY KEY,
apellido VARCHAR(32) NOT NULL);

Nota: Si la consulta tuviera más condiciones de búsqueda, como pudiera ser que el teléfono empiece por un prefijo determinado, a esta tabla temporal habría que añadirle el campo teléfono para cumplir con todas las condiciones de búsqueda.

3.- Obtener información para la tabla temporal.
SELECT id, apellido FROM persona;

4.- Para todos los registros obtenidos, descifrar el valor del apellido.

5.- Para todos los registros que ahora tenemos, con el apellido en plano, insertarlos en la tabla temporal.

6.- En este punto podemos consultar la tabla temporal con la sentencia SELECT id from WHERE apellido LIKE 'A%';

7.- Ahora ya tenemos todos los identificadores de registro que cumplen con las condiciones de búsqueda, en este momento podemos consultar la tabla original (persona) con una sentencia de este estilo: SELECT * FROM persona WHERE id IN ();

8.- Finalmente, descifrar los datos recogidos y componer la respuesta.

Con estos sencillos pasos se puede solucionar la problemática de realizar una consulta parcial a una tabla cuyos datos se guarden cifrados.
Sólo me queda aconsejar especial atención a la hora de tomar la decisión de usar tablas con datos cifrados, ya que, como se ha visto, es un lastre importante para el rendimiento de la aplicación, que se agranda cuantos más registros tengan las tablas.
Sobre el tópico de crear tablas con datos cifrados, daré algunas directrices en futuros post.

Espero que les ayude a encontrar una solución cuando se vean obligados a emplear este tipo de tablas.
Carlos.

miércoles, 10 de diciembre de 2008

Web clinicAlonso

Después de muchas muchas horas de curro, me siento muy orgulloso de poder enseñaros la página web que he creado para la clínica dental clinicAlonso.

Esta es la primera vez que hago una página entera yo solo y en serio y la verdad, estoy muy contento con el resultado. La página está hecha en php con plantillas smarty para la presentación y javascript para lograr los efectos.

Tengo que reconocer que javascript era un desconocido para mí hasta que empecé a buscar en google formas de lograr efectos que dieran la pizca de sal a la página y que, después de lo visto, me ha gustado mucho.

Seguramente, la parte más interesante sea la cantidad de ejemplos que hay en internet que puedes usar copiando y pegando prácticamente y, parece que no, pero aprendes.

A raíz de esto, yo mismo desarrollé un script que expande y colapsa una sección con cierta latencia dando la sensación de animación. En siguientes post lo explicaré detalladamente.

Una vez hecho este script, con la euforia del momento hice otro similar para otro proyecto que conocereis en breve. En este caso, el script muestra en un pop-up una sección oculta de la página.

Muchos de vosotros seguramente habréis visto este tipo de scripts o los habréis desarrollado vosotros mismos, pero para aquellos que se encuentren en la misma situación en que yo estaba hasta hace unos meses, en futuros post los explicaré paso a paso.

Como último ya solo me queda recomendaros un paseo por la web clinicAlonso y que disfruteis de la página !!

Bienvenida

Después de mucho tiempo, por fin he sacado tiempo para ir escribiendo aquí cosillas del día a día.

Espero que este blog me sirva para ir guardando constancia de los descubrimientos y de las cosas que vaya aprendiendo en mi vida diaria, tanto en mi trabajo en Unkasoft (Salamanca)
como en mi casa con mis proyectos personales que iréis descubriendo a lo largo de los siguientes post.

Tenía muchas ganas de escribir un blog porque me siento muy orgulloso de mi progreso y quiero compartir con los lectores esas sensaciones, así como sus opiniones acerca de lo que cuento.

Espero que os guste y que, con el tiempo, este blog se convierta en un diario para muchos de vosotros que es hacia quien va dedicado.

1 Saludo.
Carlos Alonso.