我正在创建简单的投票系统,主要限制是:
- 每个人只能投票一次
- 每次投票都必须严格匿名
- 系统必须进行扩展,以覆盖某些投票终端无法始终访问系统网络的情况,因此它们会定期向主节点发送投票。
我所说的严格匿名是指地球上没有任何人可以访问数据来投票。必须有关于谁已经投票的信息,但不能是关于他投票了什么的信息。
这很容易通过创建 2 个数据桶(数据库表或其他东西)来实现,一个包含有关正在投票的用户的信息,第二个包含投票但没有用户数据,并且允许一次仅将记录插入到两个桶中,但仅限如果特定用户尚未在第一个存储桶中列出。该解决方案可行,但前提是系统的每个节点都可以始终访问主数据库。
因此,有第二种方法用一些用户数据对每个投票进行签名,这样该用户创建的每个投票都将具有完全相同的符号,但无法找到使用该符号的用户。我不知道如何创建这种标志。
它可以基于只有用户拥有的东西或只有用户知道的东西,但它不会存储在其他任何地方,并且可以验证它是否合法。某种证书不会透露它所属的人,并且如果例如有人偷了它,则可能会失效。
最佳答案
博卓 has written关于电子投票,非常值得一读。在您尝试实现的具体点上:
- 允许选民只投票一次 - 通过使用强大的身份验证方法(即多因素身份验证方法)并维护选民列表,任何人都无法冒充其他人,并且每个人只有一次投票机会
- 匿名投票 - 通过使用blind signature用户签署他们的选票,然后由独立方验证、统计和签名,之后选民可以在没有签名的情况下提交选票,因此投票是匿名的,但仍由独立方验证
- 半离线或批量提交选票 - 我认为如果不损害前面的一些要点,您就无法实现这一目标,您最终会信任可能受到损害并提交假选票或扣留的选票机他们。
独立方可以是分布式的block chain使其真正独立、容错、最终一致。
关于cryptography - 签署投票,因此无法确定用户,但可以检测到重复投票,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32782535/