基于区块链和动态累加器的跨域认证方案
2021-08-23黄晓芳
张 柯,黄晓芳
(西南科技大学 计算机科学与技术学院,四川 绵阳 621010)
0 引言
随着互联网和数字经济的飞速发展,服务数字化的程度也在不断提高。例如,人们经常使用电子商务、在线支付、在线政务等,这些都需要可靠的安全机制进行保障,公钥基础设施(PKI,public key infrastructure)[1-2]利用公钥技术和数字证书提供服务,能够为用户在开放环境中进行安全的通讯提供保障。现有的证书颁发机构(CA,certificate authority)其公钥基础设施可能使用不同的密钥体系,不同的安全和认证策略,导致需要各自维护自己的信任域[3],当单个信任域提供的服务无法满足用户的需求,用户需要进行跨域访问,由此出现跨域认证问题。如何消除信任孤岛,打通信任体系,实现各CA之间证书的互认互通是亟需解决的问题。
国内外已经有大量的学者针对跨域认证进行了相关研究,并取得了一些成果,提出了一系列跨域认证模型。文献[4]提出了PKI域间认证模型,包括层次模型,网状模型和桥CA模型等,但建立桥CA存在实际困难。颜海龙等人[5]提出了CA互信互认标准体系框架,制定了多CA兼容的数字证书格式,将现有的数字证书格式规范化。彭博等人[6]利用桥CA实现不同CA的交叉认证,利用层次模型实现桥CA的互信,从理论上构建了跨域认证模型。以上研究成果表明,CA跨域认证仍然存在诸多问题有待解决。
区块链作为驱动比特币的底层技术,其具有去中心化,防篡改,透明化的特性。其本质是一个分布式不可篡改的账本,底层依靠共识机制,点对点传输,加密算法等组合而成。区块链是按照时间顺序将数据以一定的方式进行组合并形成的链式结构,将用户的身份信息存入区块链中,能够确保数据的安全和非法篡改。W.Wang等人[7]首次提出了基于区块链的跨域认证模型,随着区块链的数据量不断增大,存在着用户跨域认证效率不高的问题,周致成等人[8]等针对传统PKI跨域认证方案的效率问题,通过与区块链技术相结合,提出了基于区块链的跨域认证方案,减少了签名与验证的次数,提升了跨域认证的效率,但用户仍然需要申请对应信任域证书,产生额外的证书开销,同时撤销需要多次操作区块链,效率不高。为了提升异构域的认证效率,马晓婷等人[9]提出了一种基于区块链技术的跨异构域认证方案,实现了PKI域和IBC域之间高效安全的通讯,简化了重认证过程,降低了用户端计算量。黄穗等人[10]针对区块链跨域认证效率低的问题,提出了利用布谷鸟过滤器提升证书的查询效率,但其存在着误删的情况,难以适应重要场合的跨域认证场景。
针对以上问题,本文提出了基于区块链和动态累加器的跨域认证方案,通过将不同的CA加入到区块链中作为分布式信任中心,消除了传统CA中心化信任的弊端。通过利用智能合约构造动态累加器,避免了传统区块链跨域认证中证书的操作难题,提升了跨域认证效率,减少证书存储开销,实现证书的高效查询、注册和撤销操作。
1 相关技术
1.1 区块链技术
区块链是一种去中心化的分布式不可篡改账本[11],将数据按照时间先后顺序组合而成的块链式结构,依托密码学方式保证区块链的防篡改和不可伪造,通过共识机制将数据写入到区块链中,保证数据的一致性,利用智能合约进行数据的处理,能够在不安全的环境中进行可靠的信息交换,实现不同实体之间的信任传递[12]。
智能合约[13]是具有自动执行协议能力的计算机协议,合约包含可执行的代码和数据两部分,允许用户通过智能合约对区块链的数据进行相关的操作并对用户的输入和输出结果做出响应。比特币(BTC,Bitcoin)中的智能合约使用依靠的是UTXO(unspent transaction outputs)模型,但合约功能有限,只能实现交易功能。以太坊依靠以太坊虚拟机(EVM,Ethereum virtual machine)运行智能合约,通过合约地址进行智能合约的调用与执行,消耗GAS作为智能合约执行成本。超级账本(Hyperledger)中链码(Chaincode)支持多种语言,其被编译成一个独立的应用程序,运行于隔离的Docker容器中。
通过将区块链跨域认证协议和密码累加器机制结合,利用智能合约构造出动态累加器,将区块链证书指纹存入动态累加器中,各节点通过共识机制将数据写入到区块链账本中,能够降低证书存储成本。
1.2 动态累加器
密码学累加器[14]最早是由 Josh Benaloh 和 Michael de Mare 提出的,它能够对一组元素进行绑定操作,并能够对集合中的任何元素提供简短的成员关系或者非成员关系证明。相较于其他累加器,动态累加器[15-16]能够实现添加或移除成员时间复杂度不会随着累加器中成员的数量增加而增加,其时间复杂度为O(1)[16],具有高效的成员添加和删除效率。Wang P等人[17]给出了动态累加器的定义,下面给出动态累加器的形式化描述。
KeyGen(k,M):为了实例化参数而执行的概率算法,将安全参数k和上限M作为入参,将累加器参数P=(Pu,Pr)作为返回结果,其中Pu表示累加器的公钥,Pr表示累加器的私钥。
AccVal(L,P):用于计算累加值的概率算法,通过入参P和一组元素L={c1,c2,....,cm}(1 WitGen(ac,Al,P):见证生成算法,为每一个元素创建成员见证的概率算法。输入ac、Al和参数P,输出对于每一个ci(i=1,2,....,m)的见证值。 Verify(c,W,v,Pu):验证算法,用来验证给定的值是否为成员身份的确定性算法。输入元素c、证据W、累加值v和公钥Pu,通过证据W来验证c是否被累计入v,返回YES或者NO。 DelEle(L+,ac,v,P):从累加值中删除某些元素的概率算法,将表示为待删除的元素L-={c1-,c2-,....,ci-}(L-⊂L,1≤i≤M-m),辅助信息ac,累加值v和参数P作为入参,返回新的累加值v′保持和集合LL-一致,更新辅助信息ac和au。 本文采用区块链3种类型之一的联盟链,其具有拓展性强和共识速度快等特点,适合跨域认证场景下大规模认证操作,链上各CA节点需要经过授权才能够加入,CA节点作为各个信任域的根信任节点,主要作用是负责验证用户身份的真实性和颁发区块链证书,同时接受跨域认证用户的请求,生成区块链跨域认证证书。区块链账本数据无需中心化的可信中心,通过多个CA节点共同维护,写入账本的数据需要大多数节点的同意,区块链上的数据是公开透明的,避免了传统基于PKI的数字证书存在的中心化信任和透明度缺失的问题。针对不同CA下用户跨域认证问题,通过与区块链技术结合,形成统一的区块链证书,解决了传统跨域认证中存在的证书路径复杂,交叉互信难,单点故障问题。利用区块链将各CA形成统一的信任联盟,使得用户持有的区块链证书在不同信任域中得到认可,消除信任孤岛,提升跨域认证的效率,降低证书的管理成本。通过引入动态累加器提高身份认证的效率,降低节点的存储开销。本章主要设计了区块链证书模型和跨域认证协议。 区块链证书相较于传统的数字证书[2],减少了签名模块部分,减轻了CA节点计算验证的压力。同时为了满足动态累加器的需求,在文献[7]提出的区块链证书基础上引入了当前累加值到区块链证书中。本文设计的区块链证书如图1所示。 传统的基于区块链的跨域认证模型[7]需要对区块链进行查询操作,随着区块链数据的增加,查询耗时会线性增长,针对跨域认证中高并发的场景下,现有的方案无法进行高效的查询和插入操作的问题,结合密码学累加器,设计基于区块链和累加器的跨域认证流程,认证流程如图2所示。 1)UA→BCAB:用户UA向CAB发送区块链跨域认证请求。 2)BCAB→UA:{R1}:CAB节点收到请求响应后,将生成的随机数R1发送给UA。 3)UA→BCAB:{BCertA,SignpriUA(R1),R1}:UA将自己的区块链证书和CAB传递过来的R1进行签名值以及R1返回给CAB。 4)BCAB→BCAA:{GetCertCAA,R2}:CAB通过证书验证签名值是否有效,检查BCertA是否过期,根据证书中的颁发者向CAA节点请求获得CAA根节点区块链证书和随机数R2。 5)BCAA→BCAB:{BCertCAA,R2}:CAA节点收到来自CAB节点的请求后,返回给CAB自己的证书和随机数R2。 6)BC→BCAB:{BcertA,CAB}:将生成的跨域证书BCertA,CAB发送给CAB并将生成的哈希值通过节点之间的共识算法写入到区块链中。 7)BCAB→UA:{BcertA,CAB}:CAB将跨域证书BCertA,CAB发送UA,完成UA和CAB之间的跨域认证。 传统区块链查询数据的方式需要遍历整个区块链,随着区块链的体积不断增大,查询效率会变得低下。本文通过利用智能合约构造动态累加器,将遍历区块链中数据的方式替换为证明成员在累加器中,使得查询的时间复杂度从O(n)能够降低至O(1),降低了查询耗时,提升了跨域认证的效率。 本章主要描述了基于Hyperledger Fabric进行基于智能合约实现动态累加器的区块链证书成员添加,区块链证书成员证明,区块链证书成员删除的链码实现。 当节点成功验证用户身份后,从区块链账本中读取当前累加器对象,通过用户提交的证书信息生成区块链证书,并通过sha256(cert)生成证书的指纹和随机数n,使得mem=H(sha256(cert),n)满足裴蜀定理,动态累加器首先通过成员搜索函数verifyMembership验证当前待添加的证书是否已经存在,若未存在则动态累加器acc通过proveMembership计算并生成新的累加值accValue和用户身份信息对应见证witness。算法描述如算法1所示: 算法1:区块链跨域证书添加 1)Input: ctx,certValue 2)Output: accVaule,witness 3)ChaincodeStub stub = ctx.getStub(); 4)byte[] ojectBytes = stub.getState(Accumulator.class.getSimpleName()); 5)Accumulator acc = deserialize(ojectBytes); 6)Integer mem = H(sha256(cert),n) 7)witness1=acc .proveMembership(sha256(cert,n)); 8)return accVaule,witness; 用户将区块链证书cert、见证值witness、当前证书累加值value传递给节点,节点读取账本的数据,反序列化动态累加器对象,通过传入的cert,n,生成区块链成员对象mem用来验证区块链证书是否在累加器中,若验证通过返回true,验证不通过返回false。其中value表示当前累加器值,mem表示证书成员指纹,n表示随机数由区块链证书添加时生成,witness表示通过累加器生成的见证值。算法描述如算法2所示: 算法2:区块链跨域证书成员验证 1)Input: ctx,value,mem,witness 2)Output: 验证响应 success/false 3)ChaincodeStub stub = ctx.getStub(); 4)byte[] ojectBytes = stub.getState(Accumulator.class.getSimpleName()); 5)Accumulator acc = deserialize(ojectBytes); 6)boolean verifyPass = acc.verifyMembership(value, mem,n, witness, acc.getN()); 7)if(witness.modPow(mem,acc.getN()).comparteTo(A)==0){ 8)return true; 9)} 10)return false; 首先从区块链账本中获取当前动态累加器对象,通过算法2验证区块链证书是否在累加器中,若验证通过,从累加器中去掉该成员后重新计算累加器的值,返回删除区块链证书成员操成功响应当前并通过区块链节点共识将累加器写入到账本中,若验证失败则返回删除成员失败,终止操作。 算法3:区块链证书删除 1)Input:ctx,mem 2)Output: 删除响应 success/false 3)ChaincodeStub stub = ctx.getStub(); 4)byte[] ojectBytes = stub.getState(Accumulator.class.getSimpleName()) 5)Accumuldator acc = deserialize(ojectBytes); 6)BigInteger product = BigInteger.ONE; 7)for(BigInteger cert:certs){ 8)product =product.multiply(H(sha256(cert),cert.getNonce()) 9)} 10)acc.value = acc.value.modPow(product,acc.getN()) 11)return acc.value; 4.1.1 证书存储安全性 将区块链证书经过Hash(bcer)=m后存储在区块链上,Hash函数的单向性保证了攻击者无法通过m反推cert,通过Hash的抗碰撞性能够保证选择任意的区块链证书bcert1和bert2,使得Hash(bcert1)=bcert2是计算上不可行的。 4.1.2 累加器安全性 本文的动态累加器基于强RSA假设,在该假设下寻找满足条件的f(w,m)=wmmodn的问题是多项式时间内难解的。如果存在攻击者C能够找到一组v=f(x,y),使得v=f(x,y)=wmmodn,其中n是由两个大素数产生,那么强RSA假设不成立。因此在强RSA假设下,给定v,m,找到一个w使得v=f(x,y)是困难的,所以动态累加器f(w,m)=wmmodn是一个安全的累加器。 4.1.3 非法跨域认证安全性分析 跨域认证中存在着非授权的跨域认证等安全性问题。因此,为了防止非授权用户进行跨域认证,在跨域认证中,用户与目标节点会通过挑战-应答方式验证用户身份的合法性,目标节点会校验用户提供的证书和源跨域CA节点进行比对,确保需要验证的随机数和目标节点保存的随机数一致,确保用户的证书由源节点签发的同时起到了防止重放攻击的效果,同时在区块链证书的拓展项中加入节点白名单,只有当跨域认证用户的区块链证书里包含了目标节点的唯一ID,用户才能够与目标节点进行跨域认证操作,从而杜绝了用户非法进行跨域认证操作的可能。 4.2.1 实验环境 实验开发环境为AMD Ryzen 5 2600X 3.60 GHz CPU 和24 GB内存的PC机。利用VMware Workstation Pro 10.0.177 63创建虚拟机,并在虚拟机中通过Docker创建节点,为每个peer节点分配1 G内存和10 G存储空间。Hyperledger Fabric版本为2.2.0,链码使用Java 1.8开发,Docker版本为19.03.13。 4.2.2 实验比较 实验开始前,先批量创建区块链跨域证书3000条作为测试数据集,其中 RSA动态累加器模数是一个长度为1 024的正整数,是由两个通过Miller-Rabin素性检测算法生成和的乘积。为了避免偶发性误差,将实验重复进行5次计算平均值。图3表示查询50,100,150,200张证书的平均耗时。表1表示不同文献中的优缺点比较。图4表示不同方法在区块链上的存储成本比较。 表1 文献优缺点比较 通过证书查询平均耗时看出,文献[7]的查询耗时随着证书的个数增长而线性增长,本文的耗时随着证书数量的增加波动不大,并且查询10 000张证书耗时仍然为1秒左右,能够满足批量跨域认证应用场景,虽然查询速度落后于文献[10],但文献[10]存在着3%的误判概率,这在一些重要的身份认证场景是难以忽略的。同时,本文的证书存储相较于其他方法,存储的消耗约为其他方法的一半,随着区块链数据的增加,能够进一步降低区块链证书数据存储的成本。综上所述,本文将区块链和动态累加器相结合,在避免误判的前提下,提升了跨域认证的效率,降低了证书的存储成本。实现结果表明,该方法具备一定的有效性和可行性。 本文首先阐述了区块链技术、动态累加器的相关知识。针对传统的区块链跨域身份认证存在的证书查询效率低下,重认证耗时长的问题。提出了基于区块链和动态累加器的跨域认证方案,通过在智能合约中生成动态累加器,利用动态累加器的高效可验证特性和成员元素支持动态添加和删除的特点,构造包含累加值的区块链跨域证书,将证书的指纹作为成员值写入到累加器中,通过区块链共识机制共同维护累加器状态,提升了链上数据庞大时的查询效率,降低了证书存储开销。通过实验数据进行分析比较,结果表明,该方法能够有效提升跨域认证效率,降低证书链上存储成本。2 基于区块链和动态累加器跨域认证方案
2.1 区块链证书
2.2 协议设计
3 关键智能合约设计
3.1 区块链跨域证书添加
3.2 区块链跨域证书验证
3.3 区块链证书删除
4 安全性分析及实验
4.1 安全性分析
4.2 实验
5 结束语