签名投票因此无法确定用户,但可以检测到重复投票
Signing votes so there is no way to determine user, but duplicate votes can be detected
我正在创建简单的投票系统,其中的主要限制是:
- 每个人只能投票一次
- 每次投票必须严格匿名
- 系统必须覆盖某些投票终端无法始终访问系统网络的情况,因此它们会定期向主节点发送投票。
我所说的严格匿名是指地球上没有任何人可以访问对什么投票的数据。必须有关于谁已经投票的信息,但不能是关于他投票的信息。
这很容易通过创建 2 个数据桶(数据库表或其他东西)来实现,一个包含有关正在投票的用户的信息,第二个包含投票但没有用户数据,并且允许一次只将记录插入两个桶,但前提是特定用户尚未在第一个存储桶中列出。该解决方案可行,但前提是系统的每个节点都可以一直访问主数据库。
因此,有第二种方法可以使用一些用户数据对每张选票进行签名,这样用户创建的每张选票都将具有完全相同的符号,但无法找到使用该符号的用户。我不知道如何创建那种标志。
它可以基于只有用户拥有的东西或只有用户知道的东西,但它不会存储在其他任何地方并且可以验证它是否合法。某种不会泄露其所属人员的证书,如果有人偷了它可能会失效。
您可以让用户在特定位置预先注册,然后只允许在那里投票(然后,对于每个位置,您可以预取允许在那里投票的所有用户的列表,并且只有列表中的用户可以投票) .然后您可以继续第一种方法。
如果各个终端直接与主数据库对话,并且每个位置没有某个中间节点供该位置的所有终端与之对话,那么这当然不起作用(好吧,根本),这使得用户跟踪(我假设,一般来说,会有带有多个投票站/终端的建筑物)。
如果您允许实时完全访问数据库,仍然有可能找出一些用户投票的内容,因为您可以在投票前后查询数据库,然后只检查发生了什么变化。
第二种方法听起来像是需要一个加密的完美散列函数,尽管我不确定是否存在这样的东西。相关 post - Are cryptographic hash functions perfect hash functions? 您也可以尝试加密,但知道所使用的算法和密钥将允许您找到投票的用户,这可能不是您想要的。
Bozho has written 关于电子投票,值得一读。在您尝试实现的特定点上:
- 允许选民只投票一次 - 通过使用强身份验证方法(即多因素认证)并维护选民名单,任何人都不能冒充他人,每个人只有一次投票机会
- 匿名投票 - 通过使用 blind signature 用户签署他们的选票,然后由独立方验证、计算和签名,之后选民可以在没有他们签名的情况下提交他们的选票,因此投票是匿名的,但仍然独立方认证
- 半离线或批量提交选票 - 我不认为你可以在不损害之前的一些观点的情况下实现这一点,你最终会信任可能受到损害的投票机并提交假票或保留它们。
独立方可以是一个分布式的block chain使其真正独立、容错和最终一致。
我正在创建简单的投票系统,其中的主要限制是:
- 每个人只能投票一次
- 每次投票必须严格匿名
- 系统必须覆盖某些投票终端无法始终访问系统网络的情况,因此它们会定期向主节点发送投票。
我所说的严格匿名是指地球上没有任何人可以访问对什么投票的数据。必须有关于谁已经投票的信息,但不能是关于他投票的信息。
这很容易通过创建 2 个数据桶(数据库表或其他东西)来实现,一个包含有关正在投票的用户的信息,第二个包含投票但没有用户数据,并且允许一次只将记录插入两个桶,但前提是特定用户尚未在第一个存储桶中列出。该解决方案可行,但前提是系统的每个节点都可以一直访问主数据库。
因此,有第二种方法可以使用一些用户数据对每张选票进行签名,这样用户创建的每张选票都将具有完全相同的符号,但无法找到使用该符号的用户。我不知道如何创建那种标志。
它可以基于只有用户拥有的东西或只有用户知道的东西,但它不会存储在其他任何地方并且可以验证它是否合法。某种不会泄露其所属人员的证书,如果有人偷了它可能会失效。
您可以让用户在特定位置预先注册,然后只允许在那里投票(然后,对于每个位置,您可以预取允许在那里投票的所有用户的列表,并且只有列表中的用户可以投票) .然后您可以继续第一种方法。
如果各个终端直接与主数据库对话,并且每个位置没有某个中间节点供该位置的所有终端与之对话,那么这当然不起作用(好吧,根本),这使得用户跟踪(我假设,一般来说,会有带有多个投票站/终端的建筑物)。
如果您允许实时完全访问数据库,仍然有可能找出一些用户投票的内容,因为您可以在投票前后查询数据库,然后只检查发生了什么变化。
第二种方法听起来像是需要一个加密的完美散列函数,尽管我不确定是否存在这样的东西。相关 post - Are cryptographic hash functions perfect hash functions? 您也可以尝试加密,但知道所使用的算法和密钥将允许您找到投票的用户,这可能不是您想要的。
Bozho has written 关于电子投票,值得一读。在您尝试实现的特定点上:
- 允许选民只投票一次 - 通过使用强身份验证方法(即多因素认证)并维护选民名单,任何人都不能冒充他人,每个人只有一次投票机会
- 匿名投票 - 通过使用 blind signature 用户签署他们的选票,然后由独立方验证、计算和签名,之后选民可以在没有他们签名的情况下提交他们的选票,因此投票是匿名的,但仍然独立方认证
- 半离线或批量提交选票 - 我不认为你可以在不损害之前的一些观点的情况下实现这一点,你最终会信任可能受到损害的投票机并提交假票或保留它们。
独立方可以是一个分布式的block chain使其真正独立、容错和最终一致。