Cryptography 对投票进行签名,以便无法确定用户,但可以检测到重复投票

Cryptography 对投票进行签名,以便无法确定用户,但可以检测到重复投票,cryptography,signing,Cryptography,Signing,我正在创建一个简单的投票系统,其中主要的限制是: 每个人只能投票一次 每次投票必须严格匿名 系统必须覆盖一些投票终端无法始终访问系统网络的情况,以便定期向主节点发送投票 严格说来,我的意思是,地球上不可能有任何人能够访问数据,对什么进行投票。必须有关于谁已经投票的信息,但不能有关于他投票的信息 通过创建两个数据存储桶(数据库表或其他内容)来实现这一点很简单,一个存储桶包含关于正在投票的用户的信息,第二个存储桶包含投票但没有用户数据,并且只允许一次将记录插入两个存储桶,但前提是特定用户尚未列在

我正在创建一个简单的投票系统,其中主要的限制是:

  • 每个人只能投票一次
  • 每次投票必须严格匿名
  • 系统必须覆盖一些投票终端无法始终访问系统网络的情况,以便定期向主节点发送投票
严格说来,我的意思是,地球上不可能有任何人能够访问数据,对什么进行投票。必须有关于谁已经投票的信息,但不能有关于他投票的信息

通过创建两个数据存储桶(数据库表或其他内容)来实现这一点很简单,一个存储桶包含关于正在投票的用户的信息,第二个存储桶包含投票但没有用户数据,并且只允许一次将记录插入两个存储桶,但前提是特定用户尚未列在第一个存储桶中。该解决方案将起作用,但前提是系统的每个节点都可以始终访问主数据库

所以,第二种方法是使用一些用户数据对每个投票进行签名,即该用户创建的每个投票都具有完全相同的符号,但无法找到使用该符号的用户。我不知道如何创造那种标志


它可以基于只有用户拥有的东西或只有用户知道的东西,但它不会存储在其他任何地方,如果它是合法的,则可以进行验证。某些类型的证书不会透露它所属的人,如果有人偷了它,它可能会失效。

您可以让用户在特定位置预注册,然后只允许在那里投票(然后,对于每个位置,您可以预取所有允许在那里投票的用户的列表,并且只有列表中的用户可以投票)。然后,您可以继续第一种方法

如果单个终端直接与主数据库通信,并且每个位置没有中间节点供该位置的所有终端通信,从而跟踪用户(我假设,通常情况下,会有多个投票亭/终端的建筑物),那么这当然不起作用(好的,根本不起作用)

如果您允许实时完全访问数据库,仍然有可能找到一些用户投票的内容,因为您可以在投票前后查询数据库,然后只检查更改的内容


第二种方法听起来像是需要一个加密的完美散列函数,尽管我不确定这样的函数是否存在。相关帖子-你也可以尝试加密,但知道算法和使用的密钥将允许你找到投票的用户,这可能不是你想要的。

Bozho关于电子投票,值得一读。在您尝试实施的特定点:

  • 只允许选民投票一次-通过使用强身份验证方法(即多因素一)和维护选民列表,任何人都不能冒充他人,每个人只有一次投票机会
  • 匿名投票-通过使用用户签署他们的投票,然后由独立党验证、计数和签署,之后投票人可以提交他们的投票,而无需他们的签名,因此投票是匿名的,但仍然由独立党认证
  • 半离线或批量提交选票-我不认为你可以在不损害前面几点的情况下实现这一点,你最终会信任投票机,它可能会受到损害,并提交虚假选票或扣留选票

独立方可以是分布式的,这样它就可以真正独立、容错并最终保持一致。

哈希函数对我来说是个不错的选择,即使它们并不完美。如果破解它的成本太高(有些散列函数的计算成本很高,比如
PBKDF2
,而用户令牌可能非常非常长——我可以为每个用户将它们存储在一些可移动媒体上),那就不会成问题。