Probar que un cliente envió una solicitud: sistema de votación

2

Digamos que creé un sistema de votación donde cada votante usaría una aplicación y votaría sobre un candidato. La aplicación enviaría el voto a un servidor. El servidor almacenaría el voto en una base de datos con la solicitud IP.

¿Es posible implementar algo para garantizar en una futura auditoría / trabajo forense, mi base de datos representa solicitudes reales y no se forjó algo?

Mi idea es que mi DB debe ser una prueba de que tengo n votos y que son votos reales, no algo que yo mismo creé.

  • Cada IP permitiría un solo voto
  • No almacenaré información personal en la base de datos, la dirección IP y los datos relacionados serían lo único que se almacenará
pregunta Danilo Gomes 12.10.2018 - 04:52
fuente

4 respuestas

2

Sus especificaciones comienzan con:

  

Cada IP permitiría un solo voto

No vayas más lejos. Si puede controlar un enrutador, por ejemplo, en un entorno corporativo, puede:

  • o bien haga que todas las máquinas internas presenten externamente la misma dirección (y solo un usuario de la organización podría enviar un voto válido)
  • permite que el administrador del enrutador envíe un voto válido falsificando cualquiera de las direcciones de su organización

Y como persona soltera, actualmente uso:

  • una computadora privada
  • una computadora corporativa (solo presenta la dirección IP del firewall corporativo)
  • un teléfono inteligente privado
  • un teléfono inteligente corporativo

¿Significa que puedo enviar 3 votos diferentes o 4 en nadie en mi organización que ya haya enviado uno desde su computadora corporativa?

Lo anterior fue sobre por qué creo que tu idea es errónea . Siguiendo parte de mi opinión sobre cómo construir un sistema de votación.

Simplemente creo que no soy lo suficientemente inteligente como para inventar desde cero lo que otros han construido a lo largo de los siglos, así que solo intentaré traducir en el mundo de TI cómo funciona una elección ordinaria.

  • Regla 1: todos los votantes están registrados, y su identidad debe ser controlada antes de que una votación sea aceptada como válida; deje de imaginar votos anónimos para una elección seria .
  • Regla 2: el contenido de la votación debe mantenerse en secreto: nadie, excepto el votante mismo, debe saber lo que contiene la votación
  • Regla 3: es posible saber quién participó en una votación, al menos para controlar que los muertos no votaron (solía ser común en algunos lugares)
  • Regla 4: el cumplimiento de las reglas anteriores puede ser controlado por personas que representan a los diferentes candidatos (un candidato puede ser aquí un ser humano, un personal completo o una propuesta simple)

Esas 4 reglas se observan para la votación física, así como después de la votación. Para este último, un sobre interno (no es posible identificarlo) contiene el voto, y uno externo lleva el nombre y el signo manual del votante. Los sobres externos solo los abren los responsables de controlar la validez de la votación.

En el mundo de TI daría:

  • cada votante debe ser informado de cómo votar
  • el sistema debe poder identificar a cada votante. La forma actualizada sería un certificado en una tarjeta inteligente, pero según la relación importancia / costo, se podría considerar un nombre de usuario y una contraseña
  • el sistema de votación debe mantener un registro de qué usuario votó y cuándo - este es el registro de votación
  • el sistema de votación debe incrementar los contadores y no almacenar ningún voto individual
  • no debe ser posible saber a qué hora el contador cambió el valor para evitar la correlación con el momento en el que alguien votó (puede afectar al almacén de mostradores subyacente). Solo debe conservarse el valor final.
  • los contadores no deben ser accesibles a nadie antes del final de la elección, a menos que se pueda probar que no permite conocer los votos recientes al encuestar los contadores en intervalos cortos
  • el sistema debe ser auditado antes y después de la votación por los candidatos o las personas que los representan
respondido por el Serge Ballesta 12.10.2018 - 12:33
fuente
1

Respuesta corta a su pregunta, tal como está actualmente: No.

La razón:

  

Cada IP permitiría un solo voto

Debido a la traducción de NAT, una sola dirección IP puede representar mucho más que un solo usuario (una IP pública puede apuntar a una red corporativa completa, por ejemplo). Además, el uso de una dirección IP para identificar a alguien no es factible de ninguna manera; se puede cambiar, falsificar, etc. fácilmente, sin mencionar el hecho obvio de que varias personas que viven en la misma dirección y posiblemente incluso compartan la misma computadora obviamente también tendrían la misma dirección IP.

Realmente no puedo ver cómo podría lograr algo como esto sin incluir algún tipo de registro de usuario / votante, y el problema es obviamente el anonimato: ¿Cómo puede garantizar que una persona solo vote una vez, sin al menos almacenar? ¿Alguna cantidad mínima de información personal?

En el mejor de los casos, puedo imaginar algún tipo de solución de sistema dividido, donde un voto es anónimo, pero está respaldado por algún otro servicio que puede garantizar la singularidad de cada votante (al menos hasta cierto grado de confianza) .

Como idea básica, considera lo siguiente:

Cree un sistema de votación donde los usuarios anónimos puedan iniciar sesión con un token de acceso y registrar una votación firmada digitalmente mediante criptografía asimétrica. Esa firma digital se realizaría utilizando una clave privada que tendría una clave pública correspondiente que estaba explícitamente vinculada al token de acceso de los usuarios. El token en sí sería proporcionado por un servicio distinto, de modo que el sistema de votación en sí estaría separado de manera limpia de cualquier información que contenga datos personales sobre los votantes.

A partir de esto, un auditor podría verificar lo siguiente para cada voto simplemente mirando los votos y los tokens:

  • La votación fue emitida por un usuario que lleva el token de acceso X.
  • Ningún usuario ha emitido otros votos con ese token específico.

Ahora deberá respaldar esto con un servicio de proveedor de tokens que pueda garantizar que cada token se haya otorgado solo a una sola persona (que es elegible para votar), y que no se haya otorgado a ninguna persona más de un token único (un auditor probablemente también querrá evaluar esta parte de la solución, pero podría hacerlo al mismo tiempo que limita el acceso a la información personal sobre los votantes).

Entonces, ¿cómo podría hacer esto manteniendo al mínimo la cantidad de datos personales? La mejor opción que se me ocurre sería un sistema que almacene un hash (una "huella digital" criptográfica irreversible) de algún identificador personal, como un número de seguro social. Esto podría usarse para verificar que ningún identificador único se use más de una vez y, sin embargo, evitar que alguien con acceso a la base de datos genere una lista completa de todos los que han votado (ya que la lista solo contendría valores de hash, que son naturaleza irreversible).

Lo que esto no no evitaría, es la enumeración de cuentas; comprobar si hay personas específicas registradas, siempre que ya tenga su identificador (si estuvieran registrados, luego intentar registrarse nuevamente con sus credenciales debería causar un error o advertencia, lo que confirmaría que su cuenta existía).

Una posible solución para esto podría ser simplemente registrar todos votantes potenciales desde el principio. De esa manera, buscar una cuenta que pertenezca a alguien que haya votado devolverá el mismo tipo de resultado que buscar a alguien que no lo haya hecho, y la lógica basada en token debería funcionar. El punto principal es dividir la identificación y la votación real en dos partes separadas, y usar la criptografía para asegurar la votación, mientras mantiene la información personal fuera de ella tanto como sea posible.

Esto es bastante conceptual, y obviamente hay mucho más que considerar, pero espero que le brinde algunas ideas en el contexto de su pregunta.

    
respondido por el Kjartan 12.10.2018 - 11:30
fuente
1

TL; DR: El secreto no es "Quién" sino "Qué".

Creo que estás tomando el camino equivocado. Lo que no quieres lograr es:

  

Los votos son hechos por personas reales.

No veo por qué no debería almacenar datos personales si eso puede hacer que logre este objetivo. No hay problema en tener datos personales sobre un sistema de votación, cuando voy a votar, tengo que firmar un registro para que sepan que voté, y el gobierno sabe mucho sobre mí.

  

Lo que tiene que ser secreto es el voto.

Por lo tanto, en la medida en que el voto se mantiene en secreto, puede almacenar cualquier información personal sobre el votante que desea (y está de acuerdo).

    
respondido por el Guillaume Beauvois 12.10.2018 - 12:52
fuente
0

No. No puede estar seguro de que los usuarios votaron como lo hicieron, debido a la posibilidad de malware en el dispositivo de cada usuario. Podría mentir sobre por quién votó y votar por otra persona. Heck, es posible que ni siquiera estén usando un navegador real, y no hay forma de verificarlo desde el servidor.

En resumen, puede contar los votos entrantes de forma segura, no hay problema, pero no puede controlar la validez de la entrada, lo que arroja dudas sobre los resultados.

    
respondido por el dandavis 12.10.2018 - 18:58
fuente

Lea otras preguntas en las etiquetas