基于区块链的电子投票技术研究与实现

2023-03-20 07:41胡南方沈苏彬
科技资讯 2023年2期
关键词:投票者身份验证以太

胡南方 沈苏彬

(1.南京邮电大学计算机学院;2.南京邮电大学通信与网络技术国家工程研究中心 江苏南京 210046)

进入信息化时代以来,电子投票作为一种新的投票方式,并逐渐得到了社会的重视和应用,成为现代民主活动的象征。电子投票(E-voting)是由CHAUM D[1]在1981 年提出的,它是以互联网和通信技术为基础,利用现代密码学为安全保障,模拟传统的人工投票,来实现跨越空间的投票方式。电子投票可以解决传统人工投票方式需要在地理空间上集中的复杂难题,即使投票参与方分散在不同各地,依然可以通过网络在同一时间进行表决和投票。相对于传统的人工投票而言,电子投票的效率大大提升。

电子投票旨在通过互联网提供一个安全、方便和高效的投票环境,然而,通过互联网投票也带来了一些弊端。目前,电子投票系统主要存在以下几个问题:投票过程无法做到公开透明,投票者可能会产生信任危机;投票数据采用中心化方式存储在中央数据库中,数据安全性无法得到保证;投票者在投票过程中可能会暴露自己的个人信息,存在隐私泄露的风险。

随着比特币[2]等数字加密货币的兴起,区块链作为比特币的底层技术,受到了广泛的关注。区块链的本质是一个基于点对点网络的去中心化的网络公用账本[3],通过建立一个全网共同维护且不可篡改的账本,存储网络中所有的交易记录。区块链技术具有去中心化、数据不可篡改、数据可溯源等特点,可以提高电子投票的可信度,是解决电子投票系统可信性需求的一种新的思路。

1 相关工作分析

区块链的本质是一个去中心化的公用账本数据库,数据库中存储的是一串按照时间先后顺序链接在一起的数据区块。区块的结构以比特币为例,每个区块一般包合区块头(Header)和区块体(Body)两部分,如图1所示。

图1 比特币区块结构图

在区块头中,存储了前一区块的哈希值,通过这个值可以获取到前一区块信息,形如数据结构中指针的效果,将一个个区块连接起来,最终形成一个链状的结构。区块链也因此而得名。这样的链状结构可以保证存储在区块链中的数据都是可以追溯的。

区块体中存储着该区块包含的所有交易,这些交易经验证后通过哈希函数的处理,成为Merkle 树[4]的一个叶子结点,每两个叶子结点继续取哈希得到上一结点的值,最后的Merkle根值保存在区块头里面,同时通过数字签名技术为该区块打上时间戳[5],保证交易按照一定的时间顺序排列。通过Merkle树存储的交易信息可以满足信息无法被篡改。在电子投票中使用这样的技术来存储投票数据,可以满足投票可溯源且不可更改,为电子投票提供了一个公开的存储方式和公平的环境。

区块链采用点对点(Peer-to-Peer)的网络架构[6]。在电子投票的底层区块链采用点对点网络,能够实现对区块链节点的标识。由此,在区块链网络上通过该标识对区块链节点进行寻址,可以唯一确定一个区块链节点,即对应到唯一的投票人。另外,点对点网络中的节点均具有消息的收发功能,通过这个功能,投票人可以在区块链的节点间将自己的选票进行广播,从而完成投票的流程,另外还可以实现各个节点之间的状态同步,保证账本的一致性。

区块链通过哈希函数(Hash Function)[7]与非对称加密算法[8]实现用户的身份标识和身份验证。共识机制[9]可以在没有中心节点的情况下保证各个诚实的节点记账的一致性。

以太坊(Ethereum)[10]是一个通用的区块链平台,它具备图灵完备的智能合约执行能力,可以通过智能合约在以太坊平台上搭建去中心化的应用程序。

目前已有一些研究对基于区块链的电子投票技术进行了分析。SAYYAD S F 等人[11]调查了基于区块链的投票系统的特征,认为区块链技术能够弥补传统电子投票系统存在的不足。KIM H R等人[12]分析了将区块链应用于在线投票系统时可能出现的制度和技术问题。CABUK U C等人[13]从技术和非技术两方面探究了在电子投票系统中使用区块链技术的可行性和适用性,其分析结果证实了区块链技术能够解决一些重要的安全问题,包括匿名性、机密性、完整性和不可否认性。

在此基础上,一些研究人员提出了基于区块链的电子投票方案。ZHAO Z 等人[14]提出了一种基于比特币的电子投票协议,该协议利用比特币账户可以自由转移数字货币的特点,以交易转账的方式来进行投票。TAKBATAKE Y 等人[15]提出一种结合Zerocoin 和比特币的电子投票方案,该方案基于比特币平台,针对比特币系统具有假名而不是匿名性的特点,使用Zerocoin来为投票系统提供匿名性。董友康等人[16]提出了一种基于联盟链的董事会电子投票协议,该协议使用智能合约结合数字证书,对投票者的身份进行合法性验证。另外,该方案利用盲签名技术对选票信息进行处理,保证了投票的匿名性。MCCORRY P 等人[17]提出了一种基于以太坊区块链的电子投票方案,该方案设计了智能合约投票协议,实现自动计票。

以上研究利用区块链技术解决了许多传统电子投票的难题,如利用区块链提供匿名性、设计智能合约实现自动计票、使用数字货币代表选票等,但区块链与电子投票的结合,还存在许多问题。

(1)投票者在区块链中的身份标识和身份真实性验证问题。区块链可以为用户提供匿名,因此首先要实现的就是投票者在区块链中的身份标识。另外,电子投票系统要求在投票之前需要对投票者进行身份的合法性验证。因此,投票者如何在区块链环境中进行真实性身份验证也是重要的研究方面。

(2)目前已有方案通过预设智能合约的方式,使电子投票系统实现自动计票。但是这样的计票方案,仅能验证选票的有效性,无法保证选票的唯一性,不能解决重复投票的问题。因此,需要设计一种计票方法,能够同时验证选票的有效性和唯一性。

(3)审计性对于电子投票系统十分重要,开放的审计权限、让各方都能参与审计体现了投票结果的公开透明。但是在目前的电子投票系统中,开放可审计性与隐私保护是矛盾的。区块链数据公开透明的特点可以满足可审计性的需求,在此基础上应对保护投票者隐私的方法展开研究。

2 区块链中投票者的身份真实性验证

在基于区块链的电子投票系统中,为了保证选票的有效性,我们需要对投票者进行可信的身份验证,以实现对其所发布的选票信息进行基于其角色身份的唯一性和合法性验证。在区块链中,各参与方普遍采用匿名地址的方式来作为自己的身份标识,然而,电子投票系统要求投票者必须经过身份验证,才能获取投票资格。因此,每个参与者的虚拟身份需要与现实中的身份信息绑定,例如:身份证号或者社保卡号,从而确定投票身份的合法性。

按照节点加入的方式,可将区块链划分为公有链和私有链。公有链中任何节点都可以自由地加入和退出,私有链中只有通过身份验证才能加入。结合电子投票系统要求投票者必须经过身份验证的需求,选择在私有链上开展对电子投票身份验证技术的研究。

在基于区块链的电子投票系统中,采用椭圆曲线数字签名算法(ECDSA)作为加密算法,遵循SECP256K1 椭圆曲线的参数标准,结合密码学哈希函数SHA-256,投票者通过以上方法生成自己的区块链地址,作为自己在区块链中的标识,使用私钥进行数字签名,为选票提供认证。同时,利用这样一套身份标识标识方法,展开有关区块链中身份真实性验证的研究。表1 是对该方法中使用的符号进行定义,该方法具体描述如下。

表1 身份验证方法符号定义表

对于投票者voteri,其真实身份表示为Identityi,通过SECP256K1 椭圆曲线算法生成专属于投票者voteri私钥SKi和公钥PKi。在区块链网络中,节点对一张选票进行验证时,需要验证两个方面的内容:第一,对于一张选票msgi,确实是由voteri自己投出的,而非其他人,比如voterj假冒voteri投出;第二,投出这张选票msgi的投票者voteri,其身份Identityi必须是符合投票条件的,确保选票是有效的。

因此需要设计这样一种身份验证方式,使得在voteri没有泄露自身真实身份信息Identityi和私钥信息SKi的条件下,仍然能在区块链网络中完成自己的身份真实性验证。

首先,voteri需要先计算出两个hash值,其中,hash1使用的是voteri真实身份Identityi和私钥SKi哈希得到,hash2使用的是voteri的公钥PKi和hash1哈希得到。为保证前后使用的哈希函数一致,可设定为均采用SHA-256函数。对应的计算公式如下:

然后进行下面两个步骤,完成身份真实性验证:

步骤1:注册和登录。使用Identityi和hash2进行注册,注册中心会首先检验投票者voteri的身份Identityi是否符合投票的条件,即是否为合法的投票者。确认投票者voteri的身份是符合条件的之后,则首先将表list1中的Identityi将value 值置为1,这保证了每个合法的用户仅能使用自己的身份进行一次注册,无法通过一个身份注册多个账号。然后,将投票者voteri所发送来的hash2存入表list2中,表list1与表list2无任何映射关系,即使同时获取两张表,也无法从中得出对应信息。注册流程结束后,注册中心将表list2 发送到区块链网络中。仅存储符合要求的投票者的hash2值。

步骤2:验证。投票者voteri加入区块链网络中后,通过发送选票时附着自己的身份信息,通过私钥对hash1进行签名得到signi,目的是为了证明这张选票msgi的确是由公钥地址为PKi的参与方发出的,而不是冒充者假冒PKi发送的此选票。节点确定了选票msgi是由PKi发送的之后,利用PKi对signi进行解密,获得签名的内容hash1,然后通过hash 函数,对hash1和PKi进行取哈希,得到hash2′,节点只需要对照list2中的值,检验是否存在一个值与hash2′相等。若存在这样的hash 值,则说明这张选票msgi的发送方的身份是符合投票条件的,也就是说这张选票是有效选票。

通过上述验证方式,可以在不泄露自身身份隐私信息的前提下,完成区块链网络的身份真实性验证。

3 区块链中投票唯一性的方法

在基于区块链的电子投票系统中,投票唯一性的研究是对选票信息的真实性、有效性和唯一性的验证,其主要目的是为了解决电子投票系统中常见的重复投票的问题。这需要按照以下两个步骤展开:首先是投票者身份的真实性验证,确保参与投票的投票者都是符合投票要求的,不会有未经过身份验证的人参与投票活动,让选票的来源真实可信;其次对于通过身份验证的投票者,需要确保他们每个人的选票唯一且有效。投票者的身份验证在上一小节已经探讨,该节主要研究在基于区块链的电子投票系统中如何确保选票的唯一性和有效性。

在相关研究中,主要通过让投票者只能投一次选票的方法来保证无法重复投票。但根据电子投票的要求,投票需要满足强制自由(抗胁迫性),即投票者在投票过程中不受外界因素的强制和影响。在传统电子投票中,主流观点是投票者可以多次改变选票内容,从而减少强制的可能性。但在基于区块链的电子投票系统中,这样的做法是无法实现的。因为在区块链中,参与方将选票信息发布到网络中,即被认为是投出选票,而选票经过共识之后被存储到区块链上,其内容是无法更改的。因此,需要对投票者的投票权限加以限制,通过投票权限制保证选票的唯一性,通过投票权认定保证选票的有效性。可以引入以太坊中“Token”的概念来实现投票权的限制和认定。

以太坊中的“Token”是一种通证,它可以代表货币、资源、资产、访问权限和身份等一个或几个不同的功能。基于被赋予的属性不同,Token既可以是实用证明,也可以是权益证明。当Token 被赋予了某种权益证明时,Token 将与证明该权益的唯一标识符相关联,例如用户身份ID,此时的Token具有不可互换性,每个用户拥有的Token 只能由自己来使用。目前,以太坊使用的最广泛的定义Token 的标准是ERC20 标准,不过该标准定义的Token是可互换的Token,不满足我们的应用需求。因此我们将采用ERC721 标准,对电子投票中使用的Token进行定义。ERC721标准使用256位标识符来实现对Token 的唯一标识,每个用户使用权益证明绑定Token 时,都会产生独一无二的“契约(deeds)”,通过跟踪这个“契约”而非用户本身,来实现对Token的证明。绑定过程如下。

在基于区块链的电子投票系统中,我们将Token与每一位投票人的唯一标识绑定,也即投票人的公钥地址,此时“Token”代表了投票权的认定。每一位通过身份验证的投票者的注册账户中都会拥有初始的“Token”,该“Token”仅限投票者在投票时证明选票的有效性,不可附着在其他交易中。如果投票者确定了投票意向,可以在交易中附加上Token值来投出选票,为选票提供认证,每位投票者仅能投出一张附带Token值的选票。在投票流程结束后,对投票结果进行统计时,通过对选票中Token值的判断,来确定该选票的有效性。只有附带Token 值的选票,才被认为是唯一且有效的选票;而没有附带Token值的选票,则被认为是重复投票。通过这样一种机制,能够保证选票的唯一性和有效性。

4 区块链中可审计性与隐私保护

在区块链中,所有的交易信息和交易过程都是公开透明的,任何参与方都可以查看和验证交易的有效性。同样的,在基于区块链的电子投票系统中,区块链的数据可溯源且不可篡改的特点,使得所有的投票数据都永久且不可逆地存储在区块链中,任何参与方都可以验证选票的有效性,为投票结果的验证和审计提供了便利。但是投票数据公开透明的特点也对投票者的隐私保护提出了更高的要求。

一个可信的电子投票系统必须具备可审计性,能够保证投票结果的公平可信,这也是电子投票系统的最基本要求。同时,电子投票系统的隐私保护是指所有人都无法找出投票者与选票内容之间的联系,结合可审计性的要求,就是说所有人都能看到选票内容,但是不知道选票是谁投出的。因此,传统电子投票系统往往会采用复杂的签名加密算法,保护投票者的真实身份隐私。区块链本身具有匿名性,所有参与方在区块链中使用的身份地址与现实中的真实身份都是没有关联的,但是参与方在区块链中使用的身份地址与选票内容是公开且密切相关的。也就是说,如果区块链中某个参与方的真实身份与匿名地址一旦暴露,投票者的隐私也就不复存在。

因此,可以在投票者匿名地址与选票内容的联系上进行加密处理,达到保护隐私的目的,但是又不能完全隐藏这两者之间的联系,因为还要满足可审计性的需求。因此,在基于区块链的电子投票系统中,电子投票可审计性与隐私保护的研究,就是从可审计性的角度,设计一种加密机制,能够在不暴露投票者匿名地址与相关选票关系的情况下,所有参与方都能完成对投票结果的审计。

环签名是一种数字签名方案,签名者利用自己的私钥和集合中其他成员的公钥就能独立地进行签名。通过环签名对消息进行签名后,验证者只能知道签名者来自一个组,而不能确定是谁签署了它。环签名提供无条件匿名,这与基于区块链的电子投票系统中隐私保护的要求是一致的。

在基于区块链的电子投票系统中,选择目前主流的RST 环签名算法,表2 是对该方案中使用的符号的说明,投票者voteri生成和验证环签名的过程如下。

表2 环签名方案的符号定义表

步骤1:生成Gen。

投票者voteri的私钥SKi,所有环成员的公钥{PK1,PK2,…,PKn},给定待签名消息m。

步骤2:签名Sign。

通过以下步骤生成环签名。

(1)选取密钥k,计算k=h(m);

(2)随机选取v ∈{0,1}b;

(3)为其他环成员选取x ∈{0,1}b(1≤j≤n,j≠i),并计算yj=gj(xj);

(4)根据yj(1≤j≤n,j≠i),求满足如下等式的yn

(5)根据yn和私钥SKi求逆xs=gi-1(yi);

(6)对m的环签名为一个(2n+1)元组

步骤3:验证Verify。

根据对消息m的签名(PK1,…,PKn;v;x1,…,xn)SMT4,验证者通过验证yi是否满足公式(3)。若等式成立,环签名为有效签名,否则为无效签名。

通过以上的方式,可以实现基于区块链的电子投票系统可审计性与隐私保护的统一。

5 仿真实现

该文对于方案的仿真实现将基于以太坊区块链平台,主要由以太坊底层区块链网络、智能合约和应用程序前端组成,其总体架构如图2 所示。总体架构中包含两类角色,分别是投票发起者和投票者。

图2 系统总体架构

投票系统采用分布式架构,每一个投票者通过操作投票系统Web前端页面实现投票每个环节并与智能合约交互,从而实现去中心化的投票系统Dapp。

首先,通过以太坊平台实现底层区块链网络的搭建,投票者可以通过以太坊客户端参与到网络中,实现投票的发起和参与。智能合约部署到以太坊上后,会获得一个对应的合约地址。利用以太坊账户,通过交易,就可以触发该智能合约。web3.js 是以太坊为开发者提供的,它本质上是一个Javascript 库,其中里面封装了以太坊的一些基本格式类型,并且拥有与区块链交互的能力,可以通过其中提供的API,与以太坊中的智能合约进行交互。

该投票方案总共分为4 个过程,分别是初始化阶段、注册阶段、投票阶段和计票并公布阶段。图3展示了整个投票方案的流程。

图3 系统时序图

根据方案进行的不同阶段,可以具体设计系统流程,如图4所示。

图4 系统流程图

(1)投票发起者设置投票问题以及选项,并且设置计时器信息,用于通知投票者注册和投票的时间点,并负责部署智能合约,规定投票的流程。

(2)投票者通过SECP256K1 椭圆曲线算法获取一个公/私密钥对。投票者使用自己的真实身份以及其他相关信息进行注册,注册通过后获得加入区块链网络的资格。

(3)投票者在加入区块链网络后,仍需验证真实身份以获得投票权。若身份验证未通过,则无法获得投票权,无法参与后面的流程。

(4)投票者获得投票权后,在规定投票时间内投出自己的选票。选票信息应包含加密后的选票内容、投票者的公钥地址以及投票者的私钥签名。投票者通过节点向整个区块链网络广播自己的投票信息。

(5)在有投票者投出选票之后,区块链网络中的节点负责广播、验证和收集投票者的选票。在收集选票之前,节点首先会对选票的有效性进行验证,主要是确定选票是否是伪造的以及选票是否是有效的,通过验证的选票会被节点收集打包成区块,未通过验证的选票会被丢弃。区块打包完成后,会将区块发往区块链网络中,其他节点会对这个区块中的选票进行再一次验证。若其中有无效的或错误的选票,其余节点不会接受这个区块。只有当这个区块中的所有选票全都通过验证,节点才会接受这个区块,并向全网广播。

(6)新区块经过全网节点共识后,会被链接到现有的区块链上,并被打上时间戳。区块中的选票信息被存储在区块链上,便无法被篡改,并且可以接受所有人的检查与校验。

(7)在到达设置的投票截止时间后,节点停止收集选票,通过调用触发计票智能合约,对满足投票资格的选票进行统计,并公开结果。如有必要,也可以通过一个交易将投票结果存储到区块链上,实现投票结果的真实可信。

6 仿真实验与结果分析

该文实验的硬件环境是Intel(R)Core(TM)i5-3800H CPU(2.30GHz),RAM为8 GB,操作系统是Ubuntu16.04。该文选择在以太坊平台上进行仿真实现,通过配置创世区块文件在本地搭建了一个以太坊私有链。使用solidity 语言编写智能合约,使用Truffle 框架实现对于智能合约的编译和部署,使用Ganache 客户端生成100个账户作为方案中的投票者,模拟真实的投票场景,前端的设计基于Node.js。

实验中使用Solidity语言编写Voting.sol合约,启动本地以太坊节点,对该智能合约文件进行编译。编译结果具体见图5。

图5 智能合约的编译

创建合约时,账户将bytecode 作为交易的传递参数,广播到全网中进行验证,有效验证后合约创建成功,形成交易记录在区块链上,成功部署后会返回部署成功的消息,具体见图6。

图6 智能合约的部署

投票者通过注册加入区块链网络后,可以参与投票,使用自己的公私钥对,填写选票的内容和自己的地址,然后点击投票按钮,成功投票的信息见图7。

图7 参与投票成功

投票者在投出选票的同时,调用底层加密算法对选票进行加密处理,并使用投票者的私钥对选票信息进行签名,然后通过节点将选票广播到区块链中,至此成功参与投票,投票成功的信息见图8。

图8 成功投出选票

在到达系统预设的投票截止时间后,投票流程结束,将触发计票智能合约,智能合约将根据选票中附带的Token 值来判断选票的有效性。若选票有效,则保留选票并统计内容;若选票无效,则丢弃选票。最后将所有有效票数进行统计并发布计票结果。计票智能合约的运行结果如图9所示。

图9 计票合约运行成功

投票者投出自己的选票后,在到达投票结束时间之后,可以通过查看投票结果模块查看和校验该次投票的结果,查看投票结果的信息见图10。

图10 查看投票结果

上述仿真实验表明该文提出的基于区块链的电子投票方案可以在去中心化的环境下实现,可以顺利完成发起投票、投票、计票和查看结果的流程。

7 结语

该文针对目前电子投票系统存在的重复投票、数据不公开透明和存在隐私风险等问题,提出了基于区块链的电子投票方案。该方案实现了基于非对称加密机制的区块链电子投票身份验证方法,采用在选票中附加Token 的方法解决投票权认定的问题,利用环签名技术,能够在不暴露投票者匿名地址与相关选票关系的情况下,所有参与方都能完成对投票结果的审计,设计了面向电子投票的区块链结构,在分析电子投票实际使用需求的基础上,结合区块链的特性,设计实现了面向电子投票的区块链结构。最后,通过设计投票智能合约在以太坊平台上进行了仿真实验,仿真结果表明所提出的基于区块链的电子投票方案是可行的、正确的。

猜你喜欢
投票者身份验证以太
车易链:做汽车业的“以太坊”
微信投票乱局与治道变革
人脸识别身份验证系统在养老保险生存核查中的应用
A Study on the Contract Research Organization
百通推出入门级快速工业以太网络交换器系列
Endogenous neurotrophin-3 promotes neuronal sprouting from dorsal root ganglia
以太互联 高效便捷 经济、可靠、易用的小型可编程控制器
英国人家有空房少拿养老金
ASP.NET中的Forms身份验证的研究
塔利班割鼻惩罚投票者