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.
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.
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.
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:
La configuración es por usuario.
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.
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 |
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:
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:
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.
La instalación es sencilla:
cd /var/www/misite/ mkdir server chmod 777 server
cd server wget -O iserv.php "http://eSurvey.nisu.org/envol/iserv,iserv.php/dwnl"
Los parámetros son:
Los pasos para constuir la encuesta son:
<script language="JavaScript" type="text/javascript" charset="UTF-8" src="eSurvey.js"></script>
<form name="miEnc"> ....... <input type=button value=Enviar disabled name=bot onClick="encu.send()"> <!-- opcional --> <textarea name=tlo></textarea><textarea name=tha></textarea> </form>
<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>');
encu.log = function (msg) { ... encu.error = function (msg,cod) { ... encu.showHash = function (hash) { ... encu.sending = function (%) { ... </script>
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:
cd /var/www/misite/ mkdir lcn chmod 777 lcn
cd lcn wget -O ilat.php "http://eSurvey.nisu.org/envol/ilat,ilat.php/dwnl"
* * * * * php /var/www/misite/lcn/lat.phpSi no ha funcionado, hágalo usted a mano.
<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.
<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.
<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
La operación de cifrado RSA consiste en caclular
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
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.