我想在我的应用程序中实现一个反馈机制——基本上是一个分数。要求是:
- 总数存在,并且可以读取
- 用户可以将他的分数添加到总分中
- 用户不能添加第二个分数,但可以更改他的原始分数,再次通过删除(减去)原始分数并添加新分数来更新总分。
- 不可能确定给定用户的投票是什么
似乎这与密码学理论接壤(甚至重叠),但我找不到任何可以解决这个问题的东西。有没有人有任何特定的算法可以解决这个问题?或者甚至是我可以用来追求它的其他搜索向量?
如果存在匿名 ID,例如用户提供的值的哈希值,那么任何能够产生产生相同哈希值的东西的人都可以修改相应的投票。
从这个意义上说,仍然是匿名的,因为哈希并没有透露来源。而不是列出(用户名,投票),列出(哈希值,投票)。如果有人担心跟踪 hashValue 可以在许多民意调查中追踪,那么为散列编码一个额外的特定于民意调查的包装,这是不公开的。或者让用户将其嵌入(例如预先添加)到他们要散列的字符串中,这样他们仍然会产生唯一的提交。
如果没有能力相信匿名个人不会投票两次,您就永远无法进行匿名投票。根据定义,真正的匿名性保证您永远无法检测到重复投票。
如果您改为强制用户识别自己,您可以实施一个投票系统,以防止重复投票并在投票上下文中提供匿名性。这是一个简单的算法。
如果用户想改变他们的投票,他们登录,选择问题,然后取消投票(你的系统知道他们投票是因为它存储了这个)。此时他们可以再次选择问题(他们的投票指示已清除)并投票。
请注意,当用户取消投票时,您的系统将需要从该问题的计数中减去用户投票的价值。
您没有提供关于什么是合法投票的足够信息,但如果它是一个整数,那么您可以只保留一个总和并允许多票。这是有效的,因为将投票从 A 更改为 B 与投票 A 然后投票 (B - A) 具有完全相同的效果。
实际上,在线投票非常棘手。
如果你想要最极端的投票安全方法,你可能需要考虑这样的事情:
https://docs.google.com/document/d/1SPYFAkVNjqDP4HOt_A_YGFZy-SFXVxHoN1hpLGNFKXI/pub
它是一种在 n 个不同的服务器之间分配投票秘密的算法,每个服务器都不能自己破坏投票的匿名性。所有 n 个服务器都必须合作才能破坏匿名性,并且如果只有一个服务器覆盖其踪迹并且擦除所有加密数据,则投票秘密将永远丢失/隐藏。
该系统还可以处理重新发送选票,但任何在线投票的安全系统都存在一些固有的限制:
对于在线投票安全而言,始终存在一个最终限制,即它容易受到流量分析的影响。例如,如果一天只有一个人投票,则可以得出结论,投票结果的任何更新都是该人投票的结果。
一个完美的安全在线投票系统应该被视为一次性投票混合器。它需要很多票。缓冲它们,当投票最终结束时,它会一次性混合所有这些。这使得将投票与选民联系起来非常困难。这可以通过相当可靠的技术来实现。
然而,当我们想要更新投票时,事情变得更加棘手。如果我们想避免流量分析的可能性,那么就会有内在的同步需求。理想情况下,所有选民都必须定期重新发送更新(即使他们的更新实际上不是更新)。