本发明涉及技术身份认证,具体来讲是一种基于数字身份凭证对用户进行身份验证并实现在会话期间执行连续身份认证的装置及方法。
背景技术:
1、diffie-hellman密钥协商协议:diffie-hellman协议中首次提出密钥协商的概念,参与密钥协商的各方实体将自己的秘密消息通过一定数学结构(即代数群)隐藏起来并发送到自己所对应的通信方,各方在接收到消息后用自己的秘密信息对其进行群上的数学运算。diffie-hellman密钥协商过程如图1所示。通信双方首先各自产生秘密随机数作为私钥,随后使用私钥计算各自的临时公钥,交换信息后计算得到共享的秘密值。
2、数字身份:数字身份是用户在互联网的身份标识,用于证明数字身份持有者的身份信息或相关属性。数字身份经过了集中式身份、联盟身份以及去中心化身份阶段。传统的中心化身份存在机构之间难以共享和易造成用户身份隐私信息泄露的问题,已不适合现阶段的发展要求。目前数字身份的发展正处于对去中心化身份的探索阶段,由于区块链具备去中心化的特性,目前多数分布式身份认证系统都基于区块链技术实现数据共享、保护用户隐私安全等功能。
3、可验证凭证:可验证凭证是数字身份的核心,是对一组属性的承诺,可由任何凭证发行者、身份持有者与验证者使用。凭证一般会包含身份持有者的标识、属性等,身份持有者能够证明此凭证属于自己。除了用户本人,其他人或机构无法得知用户凭证包含的信息以及具体使用信息。可验证凭证的本质是将物理凭证的有效性与可移植性转移至数字设备,该凭证的实现依赖于加密算法与数字签名等技术,且凭证中声明的内容、元数据等能在短时间内被验证。
4、x3dh密钥协商协议:x3dh协议是三方密钥协商协议,通信各方可以通过离线的方式获取共享密钥。通信中的一方bob将部分公钥信息上传到服务器以便任何想与其建立会话的人使用,另一方alice从服务器获取bob预留的信息,并使用这些信息计算得到共享密钥,随后将自己的部分公钥发送给bob,bob计算得到最终共享密钥。x3dh解决了在不安全网络里通信各方确定共享密钥的问题。
5、双棘轮算法:双棘轮算法由两方用户使用,基于共享密钥交换加密消息。通信各方使用密钥协商协议建立共享密钥后使用双棘轮发送和接收加密消息。kdf(key derivationfunction,密钥导出函数)链是双棘轮算法的核心,通过随机的kdf密钥对输入数据进行处理,使得输出数据和随机数据无法区分。对称密钥棘轮是双棘轮算法的另一个核心概念,若攻击者窃取了一方用户的发送与接收链密钥,则可以计算未来的消息密钥并解密消息,因此,双棘轮将diffie-hellman棘轮引入更新链密钥。为实现diffie-hellman棘轮,通信双方各自生成diffie-hellman密钥对,该密钥对即为当前棘轮密钥对,当用户接收到另一方发来的新棘轮公钥时,会执行diffie-hellman棘轮步骤,用新的密钥对替换当前的棘轮密钥对。当用户发送或接收消息时,会对发送或接收链应用对称密钥棘轮步骤以获得消息密钥;当用户接收到新的棘轮公钥时,会在对称密钥棘轮执行之前执行diffie-hellman棘轮以更新链密钥。
6、零知识证明:零知识证明用于在不泄露数据本身的情况下确保数据的有效性,它允许用户在不暴露自己的实际信息的情况下证明他们的信息是符合要求的。零知识证明的实现原理是假设证明者具有关于秘密信息的知识,验证者会发出一个随机挑战,只有当证明者具有该信息的能力时,才能通过随机挑战给出正确的应答。
7、目前的安全通信方案鲜少有对用户身份的持续认证,大多是在用户通信之初进行用户的身份验证或依赖于带外通道验证用户身份的真实性,但这样无法避免通信过程中敌手的假冒攻击、也不能阻止敌手继续攻击。而依赖于带外通道进行身份验证需要额外的成本、可能会引入额外的延迟,且存在潜在的安全风险,若带外通道的安全性未得到充分保护,可能会给用户数据带来安全风险。
技术实现思路
1、针对上述问题,本发明的目的在于提供一种基于棘轮范式的数字身份凭证持续认证装置和方法,能够使两方用户在进行安全通信的情况下,执行基于各自数字身份凭证的持续身份认证,并检测自双方通信以来的消息篡改情况,且不需要可信第三方服务器的支持。技术方案如下:
2、一种基于棘轮范式的数字身份凭证持续认证装置,包括数字身份凭证生成模块、改进x3dh协议模块和持续身份认证模块;
3、所述数字身份凭证生成模块:在用户现有身份证件的基础上产生相应的数字身份凭证,以便访问需授权进入的网站;
4、所述改进x3dh协议模块:将数字身份凭证用于x3dh协议的身份认证过程,实现通信双方的共享密钥建立;
5、所述持续身份认证模块:通信双方在会话的任意时刻都能够发起身份认证,用于验证对方身份以及检测会话过程中消息的篡改情况。
6、一种基于棘轮范式的数字身份凭证持续认证方法,包括以下步骤:
7、步骤1:两方用户a和b分别基于自己已有的身份证件提取相应属性并生成数字身份凭证,即对属性的承诺,随后两方用户a和b分别与凭证发行方之间通过零知识证明交互,凭证发行方将用户凭证添加到凭证列表中,完成用户凭证的颁发;
8、步骤2:用户a基于自己的数字身份凭证生成身份证明π,随后将自己的身份密钥ika、签名预密钥spka与身份证明π上传到区块链中;
9、步骤3:需要和用户a建立会话的用户b从区块链上获取用户的身份密钥ika、签名预密钥spka与身份证明π,然后基于用户a的密钥参数和自己的密钥建立共享密钥;
10、步骤4:双方建立共享密钥后进入数据交换阶段,并在此阶段执行持续身份验证。
11、进一步的,所述步骤1之前还包括对凭证颁发系统进行初始化,并发布公共参数,具体为:
12、步骤a:选择大素数p和双线性群bg;
13、步骤b:设desct是有公共输入(troot,cred)的电路,desct断言存在cred相对应的验证路径θ证明cred∈t;其中,t是高为h的merkle树;troot为merkle树根;
14、步骤c:设descf是有公共输入(troot,cred,f)的电路,其中f是由n个merkle树构成的森林,descf断言树存在于森林中,即(troot=f1)∨…∨(troot=fn);∨为逻辑或运算,fi表示第i个merkle树根,i=1,2,…n;
15、步骤d:计算crst和crsf:
16、crst:=g16.setup(bg,desct)
17、crsf:=g16.setup(bg,descf)
18、其中,crst为desct和双线性群bg生成的公共参考字符串,其中desct是有公共输入(troot,cred)的电路,crsf为descf和双线性群bg生成的公共参考字符串,其中descf是有公共输入(troot,cred,f)的电路;
19、步骤e:发布公共参数pp=(bg,crst,crsf);
20、步骤f:凭证发行方决定支持文档的发行标准(ιzk,ιpub),并设desc为带有公共输入iauxzk的电路,desc断言ιzk(attrs,iauxzk)=1∧cred成立;ιzk为发行方的颁发标准,ιpub为公共的发行标准,attrs为用户属性,iauxzk为有关属性零知识证明的会话上下文;
21、步骤g:凭证发行方计算用于获取凭证的公共参数crsι:
22、crsι=g16.setup(bg,desc)
23、步骤h:凭证发行方发布公共参数与发行标准(crsι,ιpub);
24、步骤i:设desc是有输入(troot,cred,aux)的电路,其中aux是与凭证相关的会话上下文,访问标准φ为用户身份标识,断言下式成立;
25、φ(nk,rk,attrs,aux)=1∧cred
26、其中,∧为逻辑或交运算;nk和rk分别为假名密钥和速率密钥;
27、步骤j:计算crsφ:
28、crsφ=g16.setup(bg,desc)
29、其中,crsφ为基于访问标准φ生成的公共参考字符串。
30、更进一步的,所述步骤1具体为:
31、步骤1.1:用户产生自己的假名密钥nk以及承诺随机数r、速率密钥rk用于生成速率限制令牌;
32、步骤1.2:用户扫描自己的身份证件从中获取属性值attr,然后基于属性值attr和假名密钥nk生成身份凭证cred=com(nk,rk,attrs;r);
33、步骤1.3:设ω=(ωsd,r,nk,rk,attrs)为证人,ωsd为支持文档sd的证明;
34、步骤1.4:用户满足发行标准的零知识证明为πι=g16.prove(crsι,(cred,iauxzk),ω),生成零知识支持文档sdzk=(πι,iauxzk),用户需证明自己满足发行方的发行标准;
35、步骤1.5:用户将身份凭证和零知识支持文档(cred,sdzk,iauxpub)发送给凭证发行方;其中,iauxpub为公共的会话上下文;
36、步骤1.6:凭证发行方解析零知识支持文档sdzk=(πι,iauxzk),并用ιpub验证支持文档sdpub;
37、步骤1.7:凭证发行方使用g16.verify()算法对用户提交的零知识支持文档进行验证,即发行方执行算法g16.verify(crsι,πι,(cred,iauxzk));
38、步骤1.8:若步骤1.6与1.7中的验证未全部通过,凭证发行方拒绝颁发凭证;若步骤1.6与1.6中的验证都通过,凭证发行方选择merkle森林f中的merkle树t插入凭证,并将cred的路径θ返回给用户,θ可以证明cred∈t,最后更新merkle树t和merkle森林f。
39、更进一步的,所述groth16算法具体为:
40、1)g16.setup(bg,desc)→crs:为给定的算术电路描述生成公共参考字符串;
41、2)π证明crs所描述的电路是满足条件的,a0,…,aι表示电路的公共输入线,aι+1,…,am为专用线,π的形式表示为(a,b,c),其中a,c来自双线性群中的b来自于双线性群中的
42、3)g16.verify(crs,π,x)→{0,1}:验证给定公共输入x的证明π。
43、更进一步的,所述步骤2具体为:
44、步骤2.1:用户a基于假名密钥nk生成身份公钥iku=gnk,并产生预密钥prekey,使用假名密钥nk对预密钥进行签名,得到预密钥签名spku;
45、步骤2.2:用户a解析有关访问要求和merkle树的公共参数{crsφ,crst,crsf}为其中,crsφ为基于访问标准φ生成的公共参考字符串;计算以下证明:
46、基于访问要求的证明:
47、πφ=g16.prove(crsφ,(troot,cred,aux1),ω)
48、凭证有效的证明:
49、πt=g16.prove(crst,(troot,cred),θ)
50、πf=g16.prove(crsf,(troot,cred,f),nil)
51、其中,访问要求的用户标识aux1为用户身份公钥iku与预密钥签名spku;nil为merkle森林中的路径;
52、步骤2.3:用户a使用groth16.link()算法将上述步骤产生的证明链接在一起,由下式表示:
53、
54、其中,crsi为步骤2.2中关于访问要求、merkle树与merkle森林的公共参考字符串crsφ、crst和crsf;πi为步骤2.2中生成的证明πφ、πt和πf;
55、步骤2.4:用户a将链接后的用户身份证明πlink与用户标识aux1上传到区块链中。
56、更进一步的,所述步骤3具体为:
57、步骤3.1:用户b从区块链上获取另一用户a的密钥参数,设(aux2,aux3)=(nil,f);aux2和aux3为用户的辅助标识;
58、步骤3.2:用户b执行验证该证明是否来自用户a,若验证成功,则继续操作,否则终止操作;
59、步骤3.3:用户b生成临时密钥ekb;
60、步骤3.4:用户b使用diffie-hellman算法建立共享密钥sk:
61、dh1=dh(ikb,spka)
62、dh2=dh(ekb,ika)
63、dh3=dh(ekb,spka)
64、sk=sm3(dh1∥dh2∥dh3)
65、其中,dh1、dh2和dh3为三次diffie-hellman计算得出的结果;dh(·)为diffie-hellman算法;ikb为用户b的身份密钥;spka为用户a的签名预密钥,ika为用户a的身份密钥,sm3(·)为杂凑密码算法;||为连接运算符,连接两个字段;
66、步骤3.5:用户b删除临时密钥ekb对应私钥及diffie-hellman算法中间结果,使用共享密钥sk计算关联数据ad=encode(ika)||encode(ikb);encode(·)为加密算法;
67、步骤3.6:用户b将自己的身份密钥ikb、临时密钥ekb,以及用共享密钥sk加密的会话初始信息和关联数据ad发送给用户a;
68、步骤3.7:用户a接收到消息后,加载自己的身份密钥ika,重复步骤3.4中的diffie-hellman计算和sm3算法,产生新的共享密钥sk′,并构建新的关联数据ad′=encode(ika)||encode(ikb),然后使用新的共享密钥sk′与新的关联数据ad′解密会话初始信息;用户a产生的新的共享密钥sk′和用户b的共享密钥sk相同,构建的新的关联数据ad′和原来的关联数据ad相同,若用户a解密消息失败则中止协议。
69、更进一步的,所述步骤4具体为:
70、步骤4.1:用户a首先使用diffie-hellman棘轮和kdf棘轮来创建消息密钥,并用于消息加密,用户b接收到来自用户a的消息后,导出相等的消息密钥解密消息,通信双方用户a、b以乒乓的方式发送彼此建立的密文,即a→b、b→a、再是a→b;
71、步骤4.2:用户a、b通信若干轮后开启身份验证;
72、步骤4.3:用户a设从用b收到的最新消息索引为authidx,然后将到目前为止应该从用户b接收但却并未收到的消息索引记为skipa;
73、步骤4.4:用户a使用步骤2中产生身份证明的算法生成身份证明πa,(authidx,skipa)作为会话上下文内容aux,然后用户a将(πa,aux)发送给用户b;
74、步骤4.5:用户b接收到用户a的消息后,使用步骤3中验证身份证明的算法验证用户a的身份,并根据用户a发送的消息计算用户b基于消息的哈希值
75、
76、其中,nb是用户b已完成的身份验证步骤次数,是用户b上一个身份验证步骤中使用sm3算法计算的哈希值,设定为空字符串,是用户b从上次身份验证步骤后到消息authidx之间发送和接收的消息集合,且不包括skipa中包含的消息;为用户b在第i轮接收到的索引为(i,j)的消息的hash值;
77、步骤4.6:用户b生成身份证明πb,其中会话上下文aux为然后用户b将(πb,aux)发送给用户a;skipb为用户b应该从用户a处接收到但却没有接收到的消息索引;
78、步骤4.7:用户a接收到消息后对用户b的证明进行验证,随后使用与用户b同样的方法生成
79、
80、其中,na用户a已完成的身份验证步骤次数,是用户a上一个身份验证步骤中使用sm3算法计算的哈希值,设定为空字符串,是用户a从上次身份验证步骤后到消息authidx之间发送和接收的消息集合,且不包括skipb中包含的消息;为用户a在第i轮接收到的索引为(i,j)的消息的hash值;
81、再产生身份证明πa′,会话上下文aux变为用户a将(πa′,aux)发送给用户b;
82、步骤4.8:用户b对用户a的身份证明进行验证,若成功则身份验证完成,若任何一个验证步骤失败,则中止会话。
83、本发明的有益效果是:本发明能够确保两方用户在进行安全通信的情况下,执行基于各自数字身份凭证的持续身份认证,并检测自双方通信以来的消息篡改情况,基于现有身份基础设施就能够生成匿名凭证,并使用零知识证明技术向发行方证明凭证的知识,不再需要凭证发行方持有验证密钥。