2011-08-16 12 views
12

Mi piacerebbe implementare un meccanismo di feedback nella mia applicazione - fondamentalmente, un punteggio. I requisiti sono:Esiste un algoritmo per il voto anonimo, modificabile e sicuro?

  1. Esiste una totale, e possono essere letti
  2. Un utente può aggiungere il suo punteggio al totale
  3. Un utente non può aggiungere un secondo punteggio, ma potrebbe cambiare la sua partitura originale, di nuovo l'aggiornamento il totale rimuovendo (sottraendo) il punteggio originale e aggiungendo il nuovo.
  4. È impossibile determinare quale voto di un determinato utente è stato

Sembra che questo confina con (o addirittura si sovrappone) la teoria della crittografia, ma non sono stato in grado di trovare qualche cosa che affrontare questo. Qualcuno ha qualche algoritmo specifico che avrebbe affrontato questo? O anche ulteriori vettori di ricerca che potrei usare per perseguirlo?

+1

Si suppone che questo sia un sistema distribuito? Perché se hai una sola parte fidata (come un sito web che esegui), è banale da implementare. È necessario definire meglio i parametri del proprio sistema. –

+0

Questa domanda è probabilmente più adatta per [cryptography stackexchange] (http://crypto.stackexchange.com/). – Wyzard

risposta

3

Se esiste un ID anonimo, ad esempio un hash di un valore fornito dall'utente, quindi chiunque possa produrre qualcosa che restituisce lo stesso hash potrebbe modificare il voto corrispondente.

In questo senso, c'è ancora l'anonimato, perché l'hash non rivela la fonte. Invece di elencare (userName, vote), list (hashValue, vote). Se si teme che il tracciamento di hashValue sia rintracciabile in molti sondaggi, quindi codificare un ulteriore wrapping specifico per l'hash, che non viene rivelato pubblicamente. Oppure lasciare che l'utente incorpori (ad es. Anteporre) nella stringa da sottoporre a hash, in modo che stiano ancora producendo un invio univoco.

2

Non si può mai avere il voto anonimo senza la possibilità di credere che le persone anonime non voteranno due volte. Per definizione, il vero anonimato garantisce che non è mai possibile rilevare il voto duplicato.

Se invece si costringe l'utente a identificarsi, è possibile implementare un sistema di voto che impedisce il doppio voto e fornisce l'anonimato nel contesto del voto. Ecco un semplice algoritmo.

  1. L'utente accede. L'onere è nel sistema per impedire a un utente di ottenere più account utente.
  2. L'utente (non anonimo) seleziona un problema su cui votare.
  3. L'utente (non anonimo) emette un voto.
  4. Il sistema memorizza quanto segue:
    • Un'indicazione che l'utente ha votato il problema selezionato. Ciò impedisce la doppia votazione.
    • Il valore degli utenti vota sul problema selezionato (questo è il punteggio che hai menzionato). Questo valore è memorizzato senza riferimento all'utente che ha espresso il voto.
    • Il valore del punteggio dell'utente se hanno votato su un problema. Probabilmente bisogno di questo per essere un valore calcolato

Se l'utente vuole cambiare il loro voto, hanno accesso, selezionare il problema, quindi unvote (il sistema riconosca hanno votato perché memorizzato questo). A questo punto possono scegliere nuovamente il problema (l'indicazione del voto è stata cancellata) e votare.

Si noti che il sistema dovrà sottrarre il valore del voto dell'utente dal conteggio per il problema quando si svuota.

+0

Come è vero che il vero anonimato garantisce che non è mai possibile rilevare il doppio voto? È che dovresti sapere se una persona ha votato, e quindi quando il primo voto è stato lanciato sapresti qual è il loro voto? – cmreigrut

+1

Se qualcuno è veramente anonimo, non c'è modo di sapere che quell'individuo non ha 2 o più account anonimi. – DwB

+0

Nel sistema che hai descritto, come sottrai il voto dell'utente dal conteggio quando si sblocca? Dovresti sapere qual è stato il loro voto originale, che rompe l'anonimato. Se il tuo punto 4.3 è per quello, e il valore "calcolato" significa che è confuso (ma comunque reversibile), allora chiunque abbia accesso al codice sorgente (Ruby, Python) o un decompilatore (Java, .Net) può risalire . Altrimenti, senza la funzione di "non invitare" il tuo sistema è l'unico utilizzabile tra le risposte. –

1

Non si forniscono sufficienti informazioni su cosa sia un voto legale, ma se si tratta, ad esempio, di un numero intero, è possibile mantenere una somma e consentire più voti. Questo funziona perché cambiare un voto da A a B ha lo stesso effetto del voto A e poi del voto (B - A).

0

In realtà, il voto online è piuttosto complicato.

Se si desidera che l'approccio più estrema alla sicurezza di voto, potrebbe essere necessario prendere in considerazione qualcosa di simile:

https://docs.google.com/document/d/1SPYFAkVNjqDP4HOt_A_YGFZy-SFXVxHoN1hpLGNFKXI/pub

Si tratta di un algoritmo che distribuisce il segreto di voto tra i server n distinte che ciascuno non può rompere l'anonimato del voto da soli. Tutti i server n dovrebbero collaborare per rompere l'anonimato, e se solo uno dei server copre le sue tracce e cancella tutti i dati crittografici, il segreto di voto viene perso/nascosto per sempre.

Il sistema può anche trattare con re-invio di voti, con alcune limitazioni inerenti a qualsiasi sistema sicuro per il voto online:

Per motivi di sicurezza il voto online c'è sempre un limite massimo in termini che è vulnerabile alle analisi del traffico . Ad esempio, se un giorno vota solo una persona, si può concludere che qualsiasi aggiornamento del risultato della votazione è il risultato di tale votazione.

Un sistema di votazione online perfetto e sicuro dovrebbe essere considerato come un semplice mixer di voti. Ci vuole un numero di voti. Li tampona e quando la votazione si chiude definitivamente, li mescola tutti in una volta. Ciò rende estremamente difficile associare un voto a un votante. Questo può essere ottenuto con una tecnologia piuttosto solida.

Tuttavia, quando vogliamo aggiornare i voti le cose diventano molto più difficili. Ci sarebbe una necessità intrinseca di sincronizzazione se vogliamo evitare la possibilità di analisi del traffico. Idealmente, tutti gli elettori dovrebbero inviare nuovamente un aggiornamento a intervalli regolari (anche se il loro aggiornamento non è in realtà un aggiornamento).

+0

Dovresti cercare di ottenere quello pubblicato e criticato se vuoi che la gente lo adotti. – Emre

Problemi correlati