问题:
- 可以实现具有以下所有功能的安全投票系统吗?
- 例如,不向政府服务器(或第三方)披露任何个人的投票,保留 ZKP 投票的所有期望标准等。
- 在这种系统中是否还有其他安全问题需要考虑,您将如何解决这些问题?
动机
我想要一个安全的在线投票系统
- 不依赖加密芯片(如德国身份证),这是部署的巨大障碍,因为它要求用户拥有特殊的芯片读取硬件而不仅仅是他们的身份证,也没有类似的障碍(例如大多数正常人无法使用自我管理的 PGP)
- 它需要被普通人使用,而不仅仅是黑客或使用特殊的客户端软件。验证投票等更高级的功能可能需要特殊的软件(只要它可以由任何第三方完成,而不需要公开披露的更多信息)。
- 可以去中心化,同时保留公开证明,证明去中心化投票中的所有参与者都是被授权对该问题进行投票的唯一人(即,无需让单方收集所有 ZKP 选票以确保没有双重投票)
- 不会向任何人公开该人的投票,包括政府身份验证服务器和他们用来输入投票的任何第三方服务(或客户端软件)
- 确实允许用户以不可证明的方式向第三方披露他们的偏好,例如,以便第三方可以为好的代理提供推荐
“安全”
先发制人:这里的“安全”是指“至少与当前的投票方法一样安全”,包括邮寄投票,而不是“完全不受所有可能的攻击”。但是,如果可以减轻攻击,那就太好了——例如,如果 TOTP 身份证被盗(因此其签名被撤销),最好能够在不知道它是哪一票的情况下使该投票无效。
就这个问题而言,请不要偏离诸如一般网站安全、传输安全、您是否信任政府运行这样的身份验证服务器或拥有唯一 ID、是否有人可以窃取您的 ID 卡并学习您的密码等问题等,这不是这个问题独有的。
我的重点是密码学问题:你能否拥有一个投票的 ZKP,由仅受信任的服务器进行身份验证,而不向任何中介(等)披露投票,并且不需要客户端加密(例如加密芯片 ID 或用户管理的 PGP 密钥)。
背景
认证服务器
假设有一个政府运营的服务器:
- 了解您的所有正式注册信息(即驾驶执照、选民登记等上的任何信息)
- 为您提供带有嵌入式TOTP显示屏
的实体 ID 卡(例如您的驾驶执照)
- 服务器应该能够通过简单地标记它来撤销 TOTP,撤销是您当地 DMV 或类似机构的当面流程,说您的卡已丢失/被盗,并对其权限设置时间限制(即卡的有效期)
- 允许您使用您的 ID 的 TOTP + 密码对服务器进行身份验证
有一个 OpenID ish API,它允许第三方请求并且您可以选择性地授权以下信息的任何子集:
- 标识,例如以下的任何子集:
- 请求者唯一、人类唯一 ID(基本上,一个不可逆的散列,向第三方证明您是唯一的人类,但不能与其他站点的站点唯一 ID 相关联)
- 想要关联用户信息的站点需要使用一个通用请求者(很像“单点登录”解决方案),或者至少是一个通用伪请求者(例如,对于单个项目的分布式投票,所有与之合作的站点都可以使用被投票为“请求者”的项目的哈希值;在这种情况下,站点可以请求一个 ID 以供自己持续使用,也可以请求一个在该问题上可共享的 ID)
- 姓名
- 物理地址(或其子集,例如仅县、市或州)
- 请求者唯一、人类唯一 ID(基本上,一个不可逆的散列,向第三方证明您是唯一的人类,但不能与其他站点的站点唯一 ID 相关联)
- 人口统计信息,例如任何子集:
- 性别
- 出生日期
- 年龄
- 发色
- 眼睛的颜色
- 高度
- 照片
- 法律权威,例如以下的任何子集:
- 投票背书(例如,您登记投票的司法管辖区列表、您登记的政党、以前的选举参与历史)
- 驾驶代言(例如汽车、摩托车、卡车等)
- 警察或政府权力认可(例如,担任警察、法官、地区检察官、总检察长等)
所有此类响应还包括用于签名的 TOTP 卡的(特定于站点的)哈希(用于追溯使使用被盗 ID 进行的身份验证无效)。
再次注意,您可以授权此信息的任何子集;例如,如果您愿意,您只能授权披露站点唯一哈希和投票凭证,这仅向第三方提供“这是一个有权在 XYZ 区投票的唯一人”的最低限度。
- 标识,例如以下的任何子集:
有一个 API 允许第三方向政府服务器提供一个 blob(文本或二进制文件,也可能只是一个哈希),并请求您对其进行签名。
在签署提供的 blob(将由服务器显示)时,您可以再次授权上述任何信息作为签名的一部分,以及可选的时间戳。
签名本身可以使用任意数量的方法。
恕我直言,最简单的是政府管理的 PGP 系统,政府拥有与给定身份证相关联的签名密钥,可以撤销该密钥,使用对您进行身份验证的政府代理的密钥签署该密钥等。
然后,服务器将只签署(使用您的关联密钥或它自己的[如果您没有披露您的身份])元组(a)blob加上(b)您选择与该签名相关联的任何信息(在一个标准化格式)。
相信
假设该服务器仅被信任以提供某人的法律信息(或人类唯一性)的身份验证,以及他们对政府相关问题(例如投票权)的授权。
您不一定相信此服务器知道您可能希望您的用户签署什么。例如,它可以用来签署私人合同,只给服务器一个安全的合同哈希值;然后用户签署哈希,从而签署合同,而无需向政府披露合同,也无需向第三方披露比他们想要的更多的信息。
ZKP 投票
最后,假设您想要一个基于零知识证明的投票系统,其中:
- 每个人都知道谁参与了投票(并且他们被授权参与)
- 总的来说,每个人都可以验证投票计数是否正确——或者换句话说,可以证明每个(匿名)投票来自公开参与者名单中的唯一成员
- 这应该适用于比简单的是/否与截止日期更复杂的投票;例如,排名选择、多个选择之间的百分比分配、没有截止日期、可以更新/撤销之前的投票等。
- 特定选民可以验证他们自己的投票是否被正确计算
- 没有人可以证明哪个选民以哪种方式投票,即使有选民的合作(例如,因为选民很容易谎报哪张选票是他们的)
- 流动民主风格的代理人可以投票,并且可以反过来代理另一个代理人。(代理人的投票是公开的,但没有被确定,所以这只是一个附属系统;对代理人的投票可以公开追踪到对最终结果的投票。)
- 可以由分布式服务操作(只需要在投票的主题上进行协调并共享)
我对 ZKP 本身以外的协议建议持开放态度;我关心的只是上面的功能集,而 ZKP(由例如Helios Voting实现)是我所知道的唯一满足它们的方法。
问题是我见过的所有安全投票方法都依赖于客户端加密(客户端管理的 PGP 或加密芯片 ID),这对于普通用户来说是不可行的。我想要每个人都可以使用的东西,但仍然足够安全。