Nisu - UJI

eSurvey: Voto y encuestas telématicos.

17 mayo 2010

by Manuel Mollar
mm at nisu.org

Contenido.

  1. Introducción.
  2. El sistema.
    1. El problema.
    2. Descripción.
    3. Navegadores soportados.
    4. Prueba del sistema.
    5. Botón de envío
  3. Software libre.
  4. Software adaptado.
  5. La extensión eSurvey.
  6. Aspectos técnicos.
    1. Elementos y funcionamiento.
    2. Realización de encuestas.
      1. Instalación del server (S) y la urna (U).
      2. Construcción del webservice (W).
      3. Construcción de la encuesta.
    3. Adhesión a nuestra red.
      1. Instalación.
      2. Servidores actualmente en servicio.
    4. Especificaciones técnicas.
      1. Formato de la encuesta.
      2. Formato de intercambio entre nodos.
    5. Fundamentos.
      1. Criptografía.
  7. Notas.
Este proyecto está en desarrollo pero totalmente funcional. En esta página puede realizarse una encuesta de prueba y descargarse el software.

Introducción.

El objetivo de este proyecto es disponer de un software que permita la realización de encuestas o voto telemáticos con las máximas garantías de anonimato. Se trata de un sistema fiable (tolerante a fallos), totalmente anónimo (basado en firma ciega) e irrasteable (a través de una red con latencia controlada). La implantación es sencilla y de bajo coste, el usuario sólo necesita un navegador que soporte javascript.

El sistema se puede y se debe integrar en un sistema de encuestas o voto previamente construido, dotándole de anonimato. El sistema no incluye la confección de las encuestas ni la determinación de los usuarios autorizados a participar, esto debe programarse de la forma tradicional no anónima. No obstante, estamos adaptando algunos productos a nuestro sistema, concretamente drupal , opina, limesurvey y moodle. Para disponer de un sistema de voto básico, puede emplear este proyecto.

El sistema es open source y se distribuye bajo la licencia no comercial de la UJI.

El sistema.

Pasamos a fundamentar y describir cualitativamente el sistema. Damos una descripción técnica más adelante.

El problema.

La realización de una campaña tradicional de encuestas, realizada en soporte "papel", inspira confianza a los participantes en tanto que el anonimato parece obvio, deducible a simple vista si se realiza correctamente y necesita escasa auditoría.
Frente a ello, el uso de medios electrónicos siembra dudas al usuario final, pues el desconocimiento técnico crea una brecha insalvable entre el procedimiento y su capacidad de auditarlo. Éste es un problema inevitable en las encuestas (y voto) telemáticas y pretendemos que sea el único que dejemos sin resolver.

Nos referimos a que en las encuestas por vía telemática, el anonimato se presupone por la confianza que el participante deposita en una persona que se supone un profesional intachable, o en una empresa u organización ajena al encuestador y el encuestado que actúa con profesionalidad. Pero al final, detrás de un sistema informático hay una persona, a veces varias, por cuyas manos pasan los datos, con capacidad plena para inspeccionarlos. En resumen, el anonimato se basa en la honradez de una persona, o lo que es peor, de varias en paralelo.

Lo que pretendemos es construir un sistema que se base en la profesionalidad de muchas personas en serie, es decir que deberían ponerse todas de acuerdo en delinquir para poder romper el anonimato, como tendría que hacerse en el caso del soporte "papel", en el que para romper el anonimato se tendrían que poner de acuerdo al menos el encuestador marcando las hojas y quien las procesa. O en una votación clásica, donde tendrían que ponerse de acuerdo todos los miembros de la mesa para romper el anonimato (aún así sería difícil) o falsear los resultados.

En el caso de las encuestas, siendo menos comprometido que el del voto telemático en temas de disponibilidad e integridad, es más complejo garantizar el anonimato por lo fácil que resulta trazar la encuesta desde el origen al destino. Por ejemplo, supongamos que el participante X accede al sistema a las 10:00 y, debido a una escasa participación, nadie más lo hace hasta las 11:00. Si entra una encuesta a las 10:10, por mucho que dispongamos de un sistema capaz de desasociar el proceso de autenticación con el depósito de la encuesta, está claro de quién es la encuesta que ha llegado a las 10:10.

Descripción. ^

Así pues, el sistema busca conseguir dos objetivos: el anonimato y la no-trazabilidad. Entendemos por anonimato la total desasociación entre el participante y su participación. La no-trazabilidad es la incapacidad de establecer una relación temporal o espacial (a nivel de red telemática) mediante el seguimiento del proceso de participación.

Paradójicamente la deseada desasociación está técnicamente resuelta de manera satisfactoria utilizando técnicas matemáticas complejas como ANDOS o la que vamos a emplear en nuestro sistema, la firma ciega de Chaum. Veamos como funciona esta técnica. El participante accede al sistema de encuestas de forma autenticada. Esto es necesario para evitar que personas no autorizadas puedan participar y para evitar que él mismo participe más de una vez. El propio participante genera un ticket secreto (un número enorme) y el sistema lo firma a ciegas, lo que significa que lo firma sin poder verlo (gracias a la técnica de Chaum). Éste ticket, por tanto, no se puede relacionar con el participante. Después el participante entrega su participación junto con el ticket firmado. El sistema verifica la firma y acepta la participación sin poder asociar el ticket con la persona.

El problema es que si ésto sucede en un intervalo de tiempo reducido, el sistema puede asociar temporalmente ambas operaciones. Además, el participante se autentica desde una ubicación de red (número de IP) y entrega la encuesta desde el mismo, con lo que el proceso de firma ciega no ha servido de nada1. La solución que proponemos es utilizar una red de servidores intermedios. Estos servidores pertenecerán a organizaciones totalmente ajenas al sistema encuestador. El participante entrega su participación a uno de estos servidores junto con el ticket. Éste servidor lo entrega al sistema destinatario más tarde. Para dar verdadera confianza, realmente el primer servidor lo entrega a un segundo servidor, quien, un tiempo después lo entrega a un tercer nodo, quien un tiempo después lo entrega al destinatario. Obviamente pueden emplearse más servidores.
Tanto la ruta de servidores, a los que denominaremos nodos, como el tiempo que permanece en cada uno de ellos lo determina el participante. Cada servidor sólo sabe de quien recibe y a quien iy cuándo envía, pues la participación va cifrada en varias capas, que se van eliminando a medida que avanza por la ruta (onion routing). Al conjunto de nodos disponibles le denominamos red de latencia controlada (LNC).

Al tratarse de un sistema en diferido (la permanencia de la participación en la ruta de servidores puede ser prolongada), para evitar que la participación se pierda por el camino, el participante construye varias rutas y lo envía por separado; llegarán varias copias al destino, no importa, se eliminan fácilmente los duplicados gracias a la unicidad del ticket.

Navegadores soportados. ^

El sistema funciona al menos en los navegadores que superan el test V8. Específicamente:
  • Google Chrome (v 1.0 en adelante).
  • Internet Explorer (v 4.01 en adelante), Avant (v 11).
  • Konqueror (Kde 4, incluso Kde 3 pese a sus problemas).
  • Mozilla Firefox, Seamonkey, Iceape, K-Melon, Flock, Galeon (v 1.0 en adelante).
  • Netscape (v 8 en adelante).
  • Navegador web Gnome (probado en v 2.29).
  • Opera (v 8.5 en adelante).
  • Safari (v 3.1 en adelante)
No funciona en Dillo, Lynx.

Prueba del sistema. ^

Puede probar una encuesta ficticia (y mal diseñada2) ahora mismo, recibirá los resultados por email (no guardamos su dirección, LOPD), en 10 min:
  • Le interesa:
    El fútbol
    Los toros
    Bailar
  • Se va a dormir:
  • El sistema eSurvey le parece:
    Interesante
    Uno más
    Un desastre
  • Su dirección de email:

La encuesta es un formulario HTML totalmente estándar, sólo es particular la forma de enviarse, que es usando nuestro cliente javascript que implementa la solución de anonimato y no-trazabilidad antes explicada.

Software libre. ^

Puede usar libremente el sistema para realizar sus encuestas. Puede emplear algún CMS ya adaptado, como drupal o adaptar su propio software a partir de nuestro software.

Le agradeceríamos que también instale un nodo de la LCN, por su beneficio y el de todos los que empleamos el sistema, son 5 minutos siguiendo estas instrucciones. Cuando lo haga, por favor envíeme un correo para que pueda completar el proceso de registro. El proyecto está completamente funcional. Actualmente estamos construyendo el software para gestión de urnas de voto y adaptando las aplicaciones moodle y opina. La versión actual del cliente es 3.1. El SHA1 del cliente es:

4a0415a72289e616bf9eb2d9cab32993167df7b1

Software adaptado.

Se dispone de los siguientes paquetes de software:

La configuración es por usuario.

La extensión eSurvey.

Al usar eSurvey, el navegador ejecuta el código javascript que le envía la página web. Comprobar la validez del mismo puede ser difícil en una página web con mucho javascript. Para proteger al máximo al usuario, hemos desarrollado una extensión para Firefox que ejecuta el cliente eSurvey de forma autónoma y bloquea el javascript de la página, de modo que el usuario puede asegurarse de que la encuesta no se envía por medios no anónimos. Aunque está construida para el usuario exigente, es recomendable para todos.

La extensión tiene una apariencia visual que no puede ser simulada por ninguna página web, de modo que el usuario tiene plena certeza de que está usando la extensión y no el javascript de la página web. Al estar instalada localmente, el usuario puede validar el código de la misma y actualizarla sólo si lo desea, teniendo pleno control del código que ejecuta.

La extensión no se ha desarrollado para otros navegadores pues a fecha de hoy sólo firefox permite que una extensión bloquee el javascript, punto totalmente necesario para garantizar que es la extensión y sólo la extensión quien envía la encuesta por el medio deseado por el usuario. Para cualquier duda contactar con el desarrollador, paco at nisu.org.

Aspectos técnicos. ^

Elementos y funcionamiento.

                       

Urna
(U)
      Red de
latencia
controlada (R)
 
  7      
         
                     
                  6    
                     

Webservice
(W)
     
Server + proxy
(S)
   
  3    
       
                     
    4           2     5
                   
Sistema
clásico de
encuestas
(C)
 
        eSurvey.js (J)
  1   Navegador (N)
     
 
Fig 1
La figura 1 muestra el funcionamiento del sistema. Partimos de la existencia de un sistema clásico de encuestas (C), al que el usuario accede con su navegador (N). El sistema quizá requiera la debida auteticación, tras la cual invitará al usuario a elegir la encuesta que quiere realizar. Estas operaciones corresponden con el paso 1 de la figura 1.

El usuario puede ahora rellenar la encuesta con N, pero siempre en actividad local, pues cualquier interacción con C rompería el anonimato.

Rellenada la encuesta, el cliente javascript (J) inicia el proceso de firma ciega. La encuesta se distingue por un identificador establecido por C. El cliente J construye una estructura (ticket) que contiene este identificador y consigue la firma ciega de la misma. El cliente J soporta dos modalidades de firma ciega:

  • Firma totalente ciega. En este caso el servidor S firmará cualquier cosa que le presente J, de modo que es necesario que el servidor emplee una llave de firma distinta para cada encuesta. Así al verificar la firma, ésta sólo tendrá sentido en el ámbito de una encuesta, impidiendo trasvasar resultados de una encuesta a otra. En esta modalidad, es necesario generar un par de llaves para cada encuesta. Es el modo recomendado. El procedimiento es:
    1. El cliente J construye el ticket.
    2. Genera un factor de opacidad de 160 bits, opaca el ticket y lo envía al servidor S, junto con el identificador de la encuesta y un token de autenticación ante C (un identificador de sesión, por ejemplo) que es un parámetro establecido por C.
    3. El servidor S solicita a C a través de un webservice (W) la confirmación de que ese usuario autenticado tiene derecho a presentar esa encuesta (pasos 3 y 4 de la figura 1). En caso afirmativo, y si la fecha del sello de tiempos es correcta, firma el ticket y lo devuelve a J.
    4. El cliente J desopaca el ticket firmado, totalmente válido y anónimo.
  • Firma ciega con retos. Este caso es más complejo y debe usarse sólo cuando sea imposible generar una llave por encuesta. Es un procedimiento menos seguro y con un coste computacional elevado. El procedimiento es:
    1. El cliente J construye n tickets (con n entre 10 y 50) con la estructura mencionada que se difernecian en un identificador único de gran tamaño que J genera para tal fin.
    2. Genera n factores de opacidad de 160 bits, opaca con cada uno de ellos los n tickets y los envía (paso 2 de la figura) al servidor (S), junto con el token de autenticación ante C.
    3. El servidor S elige aleatoriamente n-1 de los tickets y solicita los factores de opacidad, desopaca los tickets con ellos y comprueba que todas tiene la estructura esperada.
    4. Solicita a C a través de un webservice (W) la confirmación de que ese usuario autenticado tiene derecho a presentar esa encuesta (pasos 3 y 4 de la figura 1). En caso afirmativo, y si la fecha del sello de tiempos es correcta, firma el ticket restante y lo devuelve a J.
    5. El cliente J desopaca el ticket firmado, totalmente válido y anónimo.

Es el momento de depositar la encuesta. Si el cliente la enviara directamente a la urna (U), un administrador de sistemas malintencionado podría fácilmente deducir la identidad del usuario a partir de la IP de origen, bien porque esté asociada al usuario o bien simplemente porque acaba de autenticarse. Entendemos que U y C forman parte del mismo sistema y que no se trata necesariamente de una urna sellada, sino que puede ser un sistema de gestión que recibe encuestas y las almacena para su procesado automático. Incluso no conociendo la IP, en un sistema de encuestas la dispersión en la participación de los usuarios puede ser notables, de modo que es muy fácil ligar en el tiempo el proceso de autenticarse con la aparición de la encuesta en U.

La forma de resolver el problema del rastreo es retrasando intencionadamente la llegada de la encuesta a U, y encaminándola a través de algún otro servidor de modo que no se pueda relacionar con el origen. Pero, ¿qué sucedería si el administrador de U y del servidor intermedio estuvieran de acuerdo? ¿Cómo forzamos el restraso sin que el usuario tenga que estar delante del ordenador?. Una forma sería permitirle salvar la encuesta en una memoria USB y forzarle a entregarla desde otro ordenador con el que, además, no se le pueda relacionar. Pero esta solución es impracticable, por incómoda y por la cantidad de incidencias que generaría en la práctica.

Proponemos la creación de una red de latencia controlada (LCN, representada por R en la figura 1). Se trata de una serie de servidores, cuantos más mejor, que colaboran con J del siguiente modo:

  1. Se establece (en la definición de la encuesta) una profuncidad del camino, digamos L.
  2. El cliente J contruye M (>L) caminos de L servidores cada uno, que pueden repetirse, pero con ciertas limitaciones. Construye M caminos para aumentar la fiabilidad o por lo menos ponerla a un nivel similar a si no estuviera R en el sistema.
  3. Cifra la encuesta para U, de modo que R no va a poder leer la encuesta, obteniendo EC (encuesta cifrada).
  4. Determina la hora de llegada de la encuesta a la urna, unos minutos después del cierre de la participación (así todas las encuestas llegan a la urna casi al mismo tiempo).
  5. Para cada una de las M rutas:
    1. Calcula la hora en que la encuesta debe abandonar cada servidor, induciendo un retraso.
    2. Contruye una estructura conteniendo la EC, la hora que debe salir del último servidor (entrada en U), un reto de autenticación y todo ello se cifra para el último servidor, obteniendo un nuevo EC.
    3. Se repite el proceso para el penúltimo servidor, antepenúltimo, etc., hasta el primero de la ruta (L servidores).
    4. Se envía el último EC construido a S (paso 5 de la figura 1), que actúa como proxy (obsérvese que no puede descifrar el EC) y lo envía al primer servidor (paso 6 de la figura 1), retornando a J el reto devuelto, lo que permite comprobar a J que el proxy hace su trabajo.
Cada uno de los servidores, recibe EC, lo descifra para sí mismo, devuelve el reto al servidor anterior y guarda localmente el EC descifrado, no enviándolo hasta la hora indicada. El resultado es que la encuesta llega con un retraso controlado (paso 7) a U y desde el último servidor del camino. Las encuestas duplicadas (M en caso de no fallar ninguna ruta), simplemente se descartan. Como el primer servidor de cada camino puede hacer trampas, el segundo servidor de cada camino descartará la encuesta si detecta un retraso intencionado en el primer servidor, pero la encuesta llegará igualmente por los M-1 caminos restantes.

Cada servidor autentica siguiente por el reto devuelto, haciendo innecesario el uso de SSL (la información está cifrada por la naturaleza del EC y cada servidor se autentica con el reto). Para evitar ataques (básicamente saturación de la bdd), cada servidor dispone de una lista de IPs de posibles clientes. Por ello, J no puede enviar la encuesta directemente al primer servidor calculado, sino que emplea a S como proxy.

Realización de encuestas. ^

Pasamos ahora a explicarle como el sistema de encuestas se adapta a su sistema. Partiendo de la base de que dispone de un sistema de encuestas clásico vía web (C en la Fig. 1), donde el usuario se autentica y rellena la encuesta, se requieren las siguientes adaptaciones para emplear eSurvey. Por una parte, las encuestas ya no podrán enviarse mediante un botón submit, sino que deberá modificarse la página para emplear eSurvey. Por otra, A requiere un servidor S (que le suministramos) y un webservice W de construcción sencilla que actúa de pasarela entre C y S. Puede emplear nuestra red R que envía la encuesta hasta su urna U, que también le sumnistramos, y una vez eliminadas las capas de cifrado y realizada la verificación de firma la entrega a su sistema C. Detallamos ahora los elementos comentados.
Instalación del server (S) y la urna (U).
Ahora describimos cómo instalar un servidor y una urna totalmente funcionales. En la instalación se obtienen también un webservice de autenticación que sólo debe tomarse como ejemplo y modificarse, y una encuesta de prueba para que verifique el funcionamiento de la instalación. La encuesta no debe tomarse como ejemplo, pues sólo sirve para verificación; para contruir una encuesta debe seguirse la documentación. El servidor realiza dos funciones, firma ciega de tickets y proxy para acceder a la red R. La urna recibe la encuesta, realiza las operaciones criptográficas necesarias de descifrado, eliminación de repetidos y verificación de firma y envía la encuesta a la URL indicada originalmente en el formulario.

La instalación es sencilla:

  1. Elija la URL donde va a colocar el script, le recomendamos que cree un directorio sólo para este fin.
  2. Cree el directorio y dele permisos de escritura (provisional) para el servidor web. Los comandos para Linux serían algo como:
    	  cd /var/www/misite/
    	  mkdir server
    	  chmod 777 server
  3. Descarge el instalador en ese directorio:
    	  cd server
    	  wget -O iserv.php "http://eSurvey.nisu.org/envol/iserv,iserv.php/dwnl"
  4. Acceda a la URL generada, algo como http://su-servidor-público.org/server/iserv.php y complete el formulario, ¡¡primero que nada, acepte la licencia!!. Si quiere saber qué es lo que va a ejecutar, pase el parámetro ?info=I y verá la estructura interna del instalador, que también puede ver en nuestro servidor (y puede ver cómo es el formulario).

  5. Cambie los permisos al directorio y, si procede, los permisos y el propietario a serv.php En el caso de un uso real del sistema, debe aplicar las restricciones de seguridad debidas, en tanto que el servidor y la urna contienen textualmente las llaves privadas que emplean, generadas en el momento de la instalación.
El sistema instalado tiene un acceso limitado a nuestra red. Además, el cliente no puede verificar la firma. Para resolver ambos problemas, durante la instalación se le registra en nuestra autoridad certificadora, donde puede completar el proceso de certificación para obtener un uso pleno de la red y un certificado que deberá usar en sus encuestas, según se explica en la documentación.
Construcción del webservice (W).
Es necesario constuir un pequeño webservice que esté conectado con su sistema general de autenticación (Fig.1) y que informe si un determinado token de autenticación corresponde con un usuario autenticado y si ese usuario puede rellenar una determinada encuesta (o voto).

Los parámetros son:

  • token: token de autenticación. Es obligatorio. Este token es el mismo que C habrá enviado como parámetro al cliente. Responderá AUTH si el token corresponde con un usuario authenticado o ERROR en caso contrario.
  • idSurvey: identificador de la encuesta o voto. Cuando recibe este parámetro, debe comprobar que el usuario, además de autenticado, tiene el derecho a participar, y si es así, tomar nota de la participación para qeu no pueda volver a hacerlo. Retornará la cadena OK si todo es correcto o ERROR en caso contrario.
  • hack: texto que indica que el servidor está siendo defraudado, debería cancelar el derecho a participar en esta y otras encuestas y notificarlo inmediatamente al administrador del sistema.
Construcción de la encuesta. ^
La encuesta es un formulario HTML compuesto con los elementos habituales, campos input, textarea y select. La encuesta no es enviada a la urna por el navegador. Por ello no pueden emplearse los mecanismos de envío propios del navegador, en particular la capacidad para enviar cualquier formulario. En su lugar se emplea un botón que activa una función javascript que se encarga del envío.

Los pasos para constuir la encuesta son:

  1. Cargue el software de eSurvey de una fuente fiable, por ejemplo:
      <script language="JavaScript" type="text/javascript" charset="UTF-8"
              src="eSurvey.js"></script>
  2. Construya la encuesta en un formulario cuyo nombre debe estar formado por letras y números, incluyendo un botón (con nombre) que envíe la encuesta. No debe de haber un botón de submit, ni action en el formulario:
      <form name="miEnc">
        .......
        <input type=button value=Enviar disabled name=bot onClick="encu.send()">
        <!-- opcional -->
        <textarea name=tlo></textarea><textarea name=tha></textarea>
      </form>
  3. Cree la encuesta según:
      <script language="JavaScript">
        encu = new eSurvey('\
    	<\?xml version="1.0"?>	\
    	<eSurveyParameters>	\
    		    <name>miEnc</name>	nombre del formulario y de la encuesta, sólo números, letras y _	\
          <idSvy>encuesta_4826a585</idSvy>	identificador único de la encuesta, sólo números, letras y _	\
    		       <lang>es</lang>	idioma, dos letras	\
     <svrUrl>http://msvr/serv.php</svrUrl>	servidor de auth y firma (URL absoluta)	\
    	      <svrAuth>dummy</svrAuth>	token de autenticación en el servidor, por ejemplo el PHPSESSID	\
       <svrCert> ... base64 ... </svrCert>	certificado del servidor, suministrado por eSurvey, \
       						poner el módulo de la llave si el cert no está disponible	\
    		 <svrExp>AQAB</svrExp>	exponente de la llave del servidor, suele ser AQAB (10001)	\
     <svrSCert> ... base64 ... </svrSCert>	(opcional) certificado individual de la encuesta, activa firma totalmente ciega	\
     						si no está presente la firma emplea <svrCert> con retos	\
    	       <svrSExp>AQAB</svrSExp>	(op) exponente de la llave del certificado <svrSCert>	\
    		   <keepA>true</keepA>	(op) intenta que no se cierre la session (que svrAuth no pierda validez)	 \
    						mientras se rellena la encuesta \
    		    <rouLen>6</rouLen>	longitud de la ruta de servidores (rouLen), de 3 a 6, poner 0 para probar la urna. \
     <bBxUrl>http://msvr/urna.php</bBxUrl>	urna (URL absoluta, no requiere SSL)	\
    <bBxMod> ... base64 ... </bBxMod>	módulo de la urna	\
    		 <bBxExp>AQAB</bBxExp>	exponente de la urna	\
       <bBxIMod> ... base64 ... </bBxIMod>	(op) módulo de la llave interna de la urna (ideado para doble llave)	\
    		   <bBxIExp></bBxIExp>	(op) su exponente	\
          <endD>08/30/2008 20:00:00</endD>	fecha de fin de participació	\
          <cloD>08/30/2008 21:00:00</cloD>	fecha de apertura de la urna = cierre de la participación, no pueden llegar más encuestas	\
    						cloD-endD >= 600+rouLen*120, poner cloD=0 para cloD=endD+2*(600+rouLen*120), recomendado	\
    		    <sButt>bot</sButt>	el nombre del botón de envío	\
    	        <areaLog>tlo</areaLog>	(op) textarea del formulario donde escribir los logs de eSurvey	\
    	      <areaHash>tha</areaHash>	(op) idem para mostrar el hash de auditoría	\
    		     <eVot>true</eVot>	(op) puesto a true muestra el voto en forma de texto antes de enviarlo	\
            <urlVer>http(s)://...</urlVer>	URL donde verificar el hash, debe mostrar un listado \
    		     <disExt></disExt>	evita el uso de la extensión del navegador, sólo para demostraciones, nunca en producción	\
          <urlExt>http://msvr/inf</urlExt>	URL de una página de información para la extensión
    		     <skip>ele1</skip>	(op) elemento del formulario que no se quiere incluir en la encuesta	\
    		     <skip>ele2</skip>	(op) idem	\
    	<eSurveyParameters>');
  4. Modifique los métodos de visualización que considere oportunos:
        encu.log = function (msg) { ...
        encu.error = function (msg,cod) { ...
        encu.showHash = function (hash) { ...
        encu.sending = function (%) { ...
      </script>
  5. Repita los pasos anteriores (a partir del 2) si quiere más encuestas en la misma página. Si sólo hay una encuesta, el formulario puede no tener nombre, pero la encuesta debe tenerlo.

Adhesión a nuestra red. ^

Usted puede usar eSurvey para sus propias encuestas o votaciones, según hemos explicado. Pero para que el sistema sea lo más seguro posible, se requiere aumentar el tamaño de la red de servidores de transporte, por lo que le rogamos se sume a nuestra red.

Basta disponer de un servidor web que esté funcionando en régimen de best effort, que pueda ejecutar scripts PHP con MySQL, y ejecutar tareas automáticas (por ejemplo mediante el cron de Linux). En este servidor instalaremos un pequeño script:

Instalación.
La instalación del script es la siguiente:
  1. Elija la URL donde va a colocar el script, le recomendamos que cree un directorio sólo para este fin.
  2. Cree el directorio y dele permisos de escritura (provisional) para el servidor web. Los comandos para Linux serían algo como:
    	    cd /var/www/misite/
    	    mkdir lcn
    	    chmod 777 lcn
  3. Descarge el instalador en ese directorio:
    	    cd lcn
    	    wget -O ilat.php "http://eSurvey.nisu.org/envol/ilat,ilat.php/dwnl"
  4. Acceda a la URL generada, algo como http://su-servidor-público.org/lcn/ilat.php y complete el formulario, ¡¡primero que nada, acepte la licencia!!. Si quiere saber qué es lo que va a ejecutar, pase el parámetro ?info=I y verá la estructura interna del instalador, que también puede ver ahora en nuestro servidor (y puede ver cómo es el formulario).

  5. Concluida la instalación, el instalador le lleva a eSurveySites, rellene los datos personales, ponga 1 como registrador y pulse Validar.

  6. El instalador ha intentado modificar el crontab del usuario que ejecuta el servidor web (probablemente apache), para automatizar la ejecución según le indica la instalación, algo como:
    	      * * * * *	php /var/www/misite/lcn/lat.php
    Si no ha funcionado, hágalo usted a mano.

  7. Cambie los permisos al directorio y, si procede, los permisos y el propietario a lat.php Tenga en cuenta que lat.php contiene la llave privada textualmente, debe protegerlo de lectura de otros usuarios.
Servidores actualmente en servicio.
Están conectados a la LCN los siguientes servidores:

Especificaciones técnicas. ^

Formato de la encuesta.
Los resultados de la encuesta se envían como un paquete XML a procesar por la urna, con el siguiente aspecto:
	  <results>
	    <question>
	      <name>pregunta1</name>
	      <response>su%20respuesta</response>
	    </question>
	  </results>
Repitiéndose el tag <question> para cada pregunta. Tanto los nombres de las preguntas como las respuestas irán en codificación urlencode. A ellos se unen características del formulario (con la misma codificación):
	  <form>
	    <action> ... URL3 ... </action>
	    <method> ... post o get ... </method>
	  </form>
Estos datos son necesarios para las adaptaciones.
La encuesta se compone de lo anterior y el ticket firmado, según:
	  <survey>
	    <form> ... según formato explicado ... </form>
	    <results> ... según formato explicado ... </results>
	    <signedTicket>
	      <ticket>
	        <idTicket>HQCiERz1r2EYKpnm6W/LVnnP+2yN</idTicket>
	        <idSurvey>enc123</idSurvey>
	        <endTime>202908318</endTime>
	        <closeTime>1202908438</closeTime>
	      </ticket>
	      <signature> ... firma del <ticket> en base64 ...</signature>
	    </signedTicket>
	  </survey>
Si la urna va a su vez cifrada, el aspecto será el mismo, pero el tag <results> contendrá los resultados cifrados, con este aspecto:
	  <results>
	    <cryp><  ... base64 ></cryp>
	    <evky><  ... base64 ></evky>
	  </results>
Para extraer los resultados en claro, debe descifrarse con RSA el campo <evky> (con la llave privada interna de la urna), obteniéndose una llave Arcfour (128 bits) con la que se descifrará el campo <cryp>, para obtener un XML conteniendo <results> ... </results> en claro.
Formato de intercambio entre nodos.
Cada nodo recibe un cryp y un evky vía POST, y al descifralos con su llave privada, obtiene:
	  <paq>
	    <cryp>< ... base64 ... ></cryp>
	    <evky>< ... base64 ... ></evky>
	    <chal> ... reto ... </chal>
	    <pchal> ... reto ... </pchal>
	    <url> ... siguiente nodo ... </url>
	    <sndD>1203422413</sndD>
	    <cloD>1203422728</cloD>
	    <node2>0</node2>
	  </paq>
El tag <pchal> es devuelto al nodo (o al cliente) para verificación, y <chal> es el que este nodo espera que le devuelva el siguiente nodo, cuya URL se especifica, al que le enviará <cryp> y <evky> por POST.

La urna recibe exactamente lo mismo, y debe descifrarlo con su llave privada (externa) como un nodo más, recibiendo la encuesta, según:

	  <paq>
	    <survey> ... la encuesta ... </survey>
	    <chal> ... reto ... </chal>
	  </paq>
donde la encuesta <survey> puede ir cifrada o no como se ha explicado antes

Fundamentos. ^

En este apartado comentamos brevemente los fundamentos del proyecto.
Criptografía.
El proyecto hace uso extensivo de la criptografía. Describimos muy brevemente los métodos empleados.
  • Arcfour
    Es un método de generación de números pseudoaleatorios que genera una secuencia con un ciclo tan grande que puede emplearse como cifrador simétrico de flujo casi ideal. El método es compatible :-) con el RC4 de Rivest. La longitud de llave puede ser hasta 2048 bits, siendo 128 un valor comúnmente aceptado como seguro. EL método se implementa en unas pocas líneas de programación en cualquier lenguaje.
  • RSA
    Es el método de cifrado con llave pública que se emplea en el 99.99% de los sistemas, entre otras cosas por ser reversible, pues puede usarse para cifrar o firmar con la misma llave. Se basa en las propiedades de los grandes números y la artimética modular. Su seguridad estriba principalmente en la imposibilidad de factorizar un número en un tiempo menor de O(n1/2). Dados dos números primos muy grandes p y q, establecemos n=pq. Los primos p y q serán secretos y n público. Dado n, no se conoce un método (y parece imposible) que permita hallar p y q en un tiempo razonable. El teorema de Euler nos dice que si m es primo con n, se cumple que m(p-1)(q-1) mod n = 1. Elegimos un número e pequeño y público, normalmente 65537 y calculamos d como la inversa de e mod (p-1)(q-1), es decir ed = 1+k(p-1)(q-1) para algún k. Mantenemos d en secreto. La llave pública es el par (e,n) y la llave privada (d,n).

    La operación de cifrado RSA consiste en caclular c = me mod n. La operación de descifrado consiste en calcular cd mod n = med mod n = m1+k(p-1)(q-1) mod n = m = m(m(p-1)(q-1))k mod n = m.

  • La firma totalmente ciega.
    Lo que se pretende es que alguien nos firme algo a ciegas, es decir sin conocer nada de su contenido. El esquema de Chaum es el siguiente. El usuario (A) tiene m y quiere obtener md mod n, siendo (d,n) la llave privada del servidor (B). Primero genera un número aleatorio r, muy grande, que mantiene en secreto y calcula x = rem mod n y lo envía a B. A partir de x B no puede obtener ni r ni m. Entonces, B "firma" x según y = xd mod n. Lo que realmente ha calculado es y = redmd mod n = r md mod n. Devuelve y a A, quien calcula r-1y mod n = md mod n, de modo que B ha firmado m sin conocerlo.
  • La firma ciega.
    El inconveniente del método anterior es que B puede llegar a firmar algo indebido, es decir que A presente un documento a su conveniencia y B lo firme creyendo que es otra cosa. Existen dos soluciones al problema. Una es vincular una llave privada a un objetivo de firma y administrativamente regular dicha vinculación. Es decir, "la llave tal sirve para tal tipo de documento y la firma no tiene valor si no es un documento de ese tipo". El problema es que el servidor debe emplear una llave diferente y requiere una compleja gestión de llaves. Por ejemplo, en el caso de un sistema de encuestas, sería necesaria una llave distinta para cada encuesta, con la complejidad que ello implica.

    La otra alternativa es emplear un protocolo estadístico, por el que B puede cercionarse "aceptablemente" de la estructura del documento que está firmando. El protocolo es como sigue. Perseguimos que el documento firmado tenga una determinada estructura y sólo pueda variar una componente aleatoria carente de significado. El interesado, A, genera N documentos, di con i=1...N. Todos los documentos tendrán la misma estructura excepto el mencionado componente aleatorio. Calcula los resúmenes (md5, por ejemplo) de cada uno mi, genera los factores de opacidad ri, y envía al servidor los N productos xi = rie mod n. El firmante, B, elije un valor de i (sea j) y solicita a A los documentos di y los factores ri con i distinto de j. Recibidos los documentos y los factores comprueba que los documentos son coherentes, es decir coinciden con el objetivo de la firma y sólo difieren en un componente aleatorio. Comprueba también que los xi corresponden con los cálculos esperados y presupone que el documento dj también tendrá la estructura de los demás, firmando de xj.

    El punto crítico es el valor de N. Si la penalización que A puede sufrir por hacer trampa es baja, A intentará conseguir un documento ilegal firmado, con lo que N debería ser grande. Si la prenalización es alta, bastará con un valor bajo de N para que el sistema funcione correctamente.

  • Secreto compartido.
    El objetivo de compartir un secreto S es que quede repartido en m trozos de modo que basten cualesquiera n (<m) para reconstruirlo, pero con menos de n no se tenga ninguna información. Para ello, un método consiste en generar un primo p (no secreto) mayor que S y un polinomio de grado n-1: F(v) = (xn-1vn-1+ xn-2vn-2+...+x2v2+x1v+S) mod p. Dando valores a v (v=1...m) se obtienen m ecuaciones, de modo que cualesquiera n bastan para resolver el sistema de ecuaciones. A cada uno de los m custodios se le entrega p, v y F(v), para un valor de v, con v=1...m, debiendo guardarse F(v) en secreto.
    Para reconstruir el secreto basta con juntar n ecuaciones a partir de los datos de n custodios, resolviendo el sistema y obteniendo S. Si no se pueden juntar n ecuaciones el sistema tiene infinitas soluciones y por tanto se tiene información cero.
Elija estilo - Legal