基于智能合约的身份管理及认证模型

2020-04-24 08:51黄晓芳
计算机工程与设计 2020年4期
关键词:公钥证书身份

潘 维,黄晓芳

(西南科技大学 计算机科学与技术学院,四川 绵阳 621010)

0 引 言

PKI[1,2]技术能够实现在网络中进行安全信息交换和身份认证,其原理是利用证书管理用户公钥,通过一个第三方可信任机构——CA中心将用户公钥和其它身份标识信息绑定生成证书,实现在互联网上验证用户身份的目的。但中心化管理方式容易导致核心CA受到攻击,并且不透明的特点使得恶意证书不能被及时检测,存在着安全性问题。除此以外,由于多个CA机构间互相独立,在实现交叉认证上具有一定的难度。自2008年“中本聪”发表《Bitcoin:A peer-to-peer electronic cash system》[3]以来,区块链技术[4,5]作为比特币的核心支撑技术得到了快速的发展。区块链的早期特征是以比特币为代表的可编程数字加密货币体系,随着区块链去中心化、公开透明以及防篡改等优点日益凸显,其用途已经不仅仅局限于虚拟数字货币,越来越多的人开始在以太坊平台通过智能合约开发不同类型的区块链应用[6]。智能合约最大的特点是通过设置执行条件以及交易规则,在不依赖第三方的情况下进行可信交易。本研究主要将区块链、智能合约技术运用到身份管理及认证上,提出了一个去中心化、分布式并且公开透明的身份管理及认证模型,解决上述PKI技术中存在的问题。

1 相关工作

区块链的出现,为解决传统PKI中存在的安全性问题和对认证机制上的改进提供了新思路,国内外研究者对其展开了较多的研究。Fromknecht等[7]提出了一种基于区块链的去中心化PKI认证系“CertCoin”,替代证书颁发机构(CA)提供密钥查询和身份绑定服务,解决了当前PKI中需要可信第三方机构导致的安全性问题。CertCoin利用在线密钥对和离校密钥对实现身份的注册、验证及撤销。但其缺点在于没有进行身份验证,意味着无论谁首先声称身份的所有权就可以拥有该域名。Axon L等[8]提出了一种基于隐私保护的区块链PKI——PB PKI,创新之处在于无需将公钥和用户身份信息相关联,避免了通过公钥追踪到用户身份的风险。Alexander等[9]提出了一个基于区块链的PKI框架来管理X.509证书,通过给定证书与根证书之间的链接——信任链,实现对给定证书的验证。但只在区块链中存储了信任链中的最终实体证书的Hash,一旦出现虚假证书将无法被监控。Wentong Wang等[10]提出了一种基于区块链的跨域认证模型——BlockCAM,以此解决用户访问不同域名获取资源的安全性和效率问题,其主要思想是将所有CA机构组成一个联盟链,在区块链上存储用户向CA申请的证书Hash值。Rong Wang等[11]提出了一个基于权限区块链的隐私保护PKI系统,该系统将用户身份认证与授权分离,实现匿名发布证书,从而保护用户身份隐私安全。Ze Wang等[12]提出了一个基于区块链的证书发布和撤销过程透明的方案,但证书的撤销主要还是依赖于CA定期发布撤销证书并且没有提出一个很好的监控架构。

以上提到研究都是为了解决传统PKI带来的安全性问题,尽管侧重点不尽相同,但基于证书的方式难以满足用户多种类型身份数据的管理和认证需求[13]。因此提出了一种基于智能合约的去中心化身份管理及认证模型,实现用户多类型身份数据的发布、认证以及撤销,旨在解决传统PKI中心化的特点带来的不足以及多CA之间互信难导致认证机制不灵活的问题。其中“数据”是指用户通过智能合约发布的身份数据,存储在区块链中用于身份证明的凭证,具有不同的身份属性和类型,例如学历信息、银行卡信息等。本研究支持用户拥有多条身份数据,实现在不同场景中根据不同的认证需求,使用所需数据凭证证明身份而不必提供用户其它的身份信息,降低身份信息泄露的风险。

2 模型设计

本研究采用区块链类型之一的联盟链,节点经过授权后才能加入其中,其中CA节点作为联盟链中的验证节点,主要作用是验证用户身份数据的真实性并签发用户身份认证凭证。整个区块链分布式数据库不需要一个可信中心存在,由多个节点共同维护,共识机制使得写入的数据经过大多数节点同意,并且这些数据在区块链中是公开可查的,这些优点可以有效解决传统PKI中心化的特点带来的安全性问题以及多CA之间互信难导致认证机制不灵活的缺点。在现实中,姓名、家庭住址等多种身份属性信息组合成了一个人的实体。同样的在本研究中,“一个人”由多条身份数据组成,这些数据作为用户进行身份认证的凭证。由于用户具有多类型身份数据,因此在某个服务商进行身份认证时,只需要根据认证要求提供所需身份数据凭证即可,不必提供其它的身份信息,有效降低身份信息泄露的风险。

模型主要结构如图1所示,主要包括区块链和可供外部调用的区块链接口。用户、服务商以及验证节点通过调用接口实现用户多类型身份数据的发布、认证以及撤销。在模型中,以主要的发布和认证过程为例,对其过程进行了图示说明。其中用户数据发布过程主要包含用户身份数据注册以及验证节点对数据的验证过程,分别对应图1中步骤(2)、步骤(3)和步骤(4)、步骤(5)。认证过程主要是用户利用已发布的数据在其它服务商处进行身份认证,主要过程如图1中步骤(6)、步骤(7)所示。

3 智能合约及关键流程设计方案

模型的关键在于智能合约的设计,通过智能合约编写用户身份数据发布、认证以及撤销相关规则,主要是利用Solidity语言加以实现。此外,在客户端实现主要是引用了第三方库Web3.js,这是一个以太坊基于JavaScript的API,用于连接以太坊,客户端的主要作用是实现用户管理和发布身份数据。智能合约主要分为用户身份数据(User-Identify)和可供外部调用的接口函数两部分。在智能合约中,一个用户对应多个以ID为标识的身份数据,一条身份数据主要包括身份明文信息的哈希值InfoHash、身份数据唯一标识ID、拥有者以太坊公钥地址ownerAddr、认证状态status(pendding/pass/revoke)。 除此以外,智能合约还包括实现用户身份数据的发布、认证以及撤销有关的可供外部调用的接口函数。下面将详细阐述如何通过智能合约实现模型中的发布、认证和撤销过程。

3.1 用户登录

新用户在客户端注册一个以太坊账号,返回账户公钥地址、私钥等,用户在区块链中的身份与该地址关联,代表着现实世界中的实体。已有账号用户登录客户端后,可进行身份数据的注册和管理已发布身份数据等。

3.2 发布过程

主要分为用户身份数据注册过程和验证节点对数据的验证过程,如图2所示。

3.2.1 身份注册过程

主要是用户在客户端通过调用智能合约中的REGISTER函数(如算法1所示)将其身份数据与其在区块链中的身份进行绑定的过程。首先,存储InfoHash和指定验证节点signer,设置公钥地址ownerAddr为调用方(msg.sender)的以太坊公钥地址,设置认证状态status为pendding。最后,生成并返回此条用户身份数据唯一标识ID,用户在本地客户端存储ID。

图1 基于智能合约的身份管理及认证模型设计

图2 用户身份数据发布过程

算法1: 注册身份数据

Input: infoHash,signer

Output: 身份数据标识符ID

(1) function REGISTER (infoHash,signer)

(2) ID = generateID (msg.sender,infoHash,now)

(3) userIdentity = UserIdentity[ID]

(4) userIdentity.infoHash = infoHash

(5) userIdentity.ownerAddr = msg.sender

(6) userIdentity.signer = signer

(7) userIdentity.status = pedding

(8) return ID

(9) end function

3.2.2 验证过程

验证过程主要指的是验证节点对用户已注册身份数据进行验证的过程。主要如下:

(1) 用户向验证节点发起验证请求

User→node∶req(ID,Info,sign(sk,Info))

(1)

用户客户端将3.2.1中返回的身份数据标识符ID、身份明文数据Info以及用户私钥sk对Info的签名值sign(sk,Info)提交给验证节点,节点检查用户Info的格式以及真实性,有误则返回失败响应。

验证节点收到请求后,对数据的验证过程如下:

(2) 验证节点根据ID通过智能合约获取对应InfoHash等身份数据。

(3)验证节点计算Hash(Info)是否与InfoHash相等,保证用户提供的Info与已存储的身份数据一致且完整,保证用户发布数据的真实性。

(4)验证节点验证签名。在以太坊中,用户创建一个账户时,通过私钥可生成对应公钥,由公钥产生唯一以太坊公钥地址,该地址代表着用户在区块链中的实体,因此在对用户身份数据验证时,如果能证明用户拥有该公钥地址对应私钥即可证明对注册身份数据的所有权。验证节点通过验证用户对身份信息Info的签名值sign(sk,Info)确保用户拥有对应私钥,保证用户对该身份数据的所有权。

(5)验证节点修改认证状态、发布数据。在通过上述几个步骤证明了用户对指定ID身份数据的所有权之后,验证节点通过调用智能合约中的CONFIRM函数(如算法2所示)修改该条身份数据认证状态status为pass,表明该条数据已经通过了自己的验证,并设置过期时间expiryDate,然后发布该条身份数据。经过联盟链中各个节点共识后用户身份凭证InfoHash存储在区块链中,最后触发emitConfirmEvent事件(监听此事件的用户客户端及时得到响应),返回成功响应。

(6)用户本地客户端接收到成功响应后,存储此条身份数据的ID、验证节点地址、过期时间,以便用于后续的身份认证中。

算法2: 验证数据

Input: ID,expiryDate

Output: 响应信息success/error

(1) function CONFIRM(ID,expiryDate)

(2)userIdentity = UserIdentity[ID]

(3)if msg.sender = userIdentity.signer then

(4)userIdentity.status = pass

(5)userIdentity.expiryDate = expiryDate

(6)emitConfirmEvent(ID,msg.sender,expiryDate)

(7) return success

(8)else

(9) return error

(10) end if

(11) end function

3.3 认证过程

认证过程主要指的是用户在网络中获取资源服务时,服务商对用户进行身份认证的过程。根据不同的认证需求,用户选择所需的已发布身份数据进行认证。对于普通服务商来说,无需本地存储用户身份数据进行认证,只需要从区块链直接获取身份数据凭证后验证即可,减少了成本的同时也降低了用户身份信息泄露的风险。主要如下:

(1)用户向服务商发起认证请求

User→server∶req(ID,Info,sign(sk,Info))/
req(ID,sign(sk,ID))

(2)

根据服务商对身份认证的需求不同,有的需要在对用户进行身份认证的同时获取明文信息,有的则只需要一个认证结果,不需要明文信息。因此用户可以在认证时选择是否提供身份明文信息Info。下面以前者为例,对认证过程进行说明。与3.2.2节中验证过程类似,首先用户提供给服务商已发布的用户身份数据标识符ID、对应的身份明文信息Info和用户私钥sk对Info的签名值sign(sk,Info)。

服务商接收到认证请求后,利用用户提交的身份数据以及通过发布过程在区块链中存有的身份数据凭证对用户身份进行验证,步骤如下:

(2)检查数据Info格式,有误返回认证失败的响应信息。

(3)根据ID通过智能合约获取对应InfoHash、ow-nerAddr、signer等身份数据。

(4)计算Hash(Info)是否与InfoHash相等,保证用户提供的Info与已发布身份数据一致且完整,防止数据造假。

(5)验证用户对身份信息Info的签名值sign(sk,Info)确保用户拥有对应私钥,保证用户具有该身份数据所有权。

(6)检查signer是否是所信任节点地址,确保该条数据是由自己所信任节点验证(签发)。

(7)检查认证状态status是否为pass,以及当前时间是否超出过期时间expiryDate。

若以上过程均满足,该用户身份认证通过,返回认证成功的响应信息,服务商可以提供后续资源服务。

3.4 撤销过程

撤销过程主要指的是验证节点修改指定已发布身份数据认证状态的过程。通过调用智能合约中的REVOKE函数(如算法3所示)将认证状态由pass修改为revoke:①检查调用方是否为signer,若不是则不能进行撤销操作;②将指定身份数据标识符ID对应的认证状态status修改为revoke;③触发撤销事件(emitRevokeEvent),使得应用方(如服务商)及时更新最新数据,不需要CA机构定期发布撤销证书列表就能被及时检测到。

算法3: 撤销数据

Input: ID

Output: 响应信息success/error

(1) function REVOKE(ID)

(2)userIdentity = UserIdentity[ID]

(3)if msg.sender=userIdentity.signer then

(4)userIdentity.status = revoke

(5)emitRevokeEvent(ID,msg.sender)

(6) return success

(7)else

(8) return error

(9)end if

(10) end function

4 模型安全性分析

4.1 数据真实性分析

确保用户发布身份数据的真实性,是进行身份认证的前提。主要通过以下步骤保证用户发布的身份数据的真实性。首先,验证节点需要验证用户提交的数据Info的真实性和完整性;其次,验证节点计算Hash(Info)并与用户事先注册的身份数据哈希值InfoHash进行比较,根据两个Hash值是否相同来保证身份数据属于同一用户。最后,验证节点验证用户对数据的签名值,确保用户拥有发布数据账户对应私钥。以上步骤均通过,由验证节点写入区块链中。对于验证节点来说,一旦签发了虚假数据,经验证发现后,该节点签发的身份将不再可信。除此以外,若是恶意分子想要冒充用户身份通过认证获取资源服务,首先,需要获取相关身份数据唯一标识ID。其次,需要获取ID对应的完整身份数据Info。最后,需要获取用户对应私钥。因此冒充身份具有一定的难度。

4.2 隐私安全性分析

首先是匿名性,用户数据不以明文形式存储而是身份数据哈希值,保证了用户在区块链中身份的匿名性。由于哈希函数单向性的特点,保证了即使恶意节点获取了已发布数据的InfoHash,也无法得到用户真实明文信息,确保用户身份信息不被泄露。验证节点在验证和撤销过程中,不能修改用户身份信息,只能对认证状态进行修改,保证了用户身份数据的有效性。其次,用户自主可控。在身份数据发布过程中,用户可以选择发布何种类型的身份数据,并且在认证阶段,用户提供服务商需要的身份数据进行认证,不需要其它数据。全过程用户自主可控,避免了身份信息泄露的风险。

4.3 其 它

传统基于CAs的PKI容易受到攻击,一旦被攻击者控制,其颁发的证书将不再可信。由于区块链去中心化、分布式网络的特点,即使一个节点发生故障,其它节点也不会受到影响,不会影响整个系统的工作,并且用户身份数据经过发布、共识之后,由各节点共同维护,确保数据的有效性和不被篡改,从而避免传统CA的单点失效的问题。此外,对于服务商来说,只需要从区块链中获取认证凭证即可,不需要本地数据库存储用户身份数据用于身份认证,避免了用户身份信息泄露的危险。

5 结束语

本研究针对传统PKI中心化的特点带来的安全性问题以及多CA之间互信难导致认证机制不灵活的问题,提出了一种基于智能合约的去中心化身份管理及认证模型,利用智能合约实现用户身份数据的发布、认证和撤销过程。用户身份数据经过共识、发布后之后,能够在其它服务商用于身份认证,实现交叉认证的目的。除此以外,支持用户发布多条身份数据,在不同场景根据不同的认证需求,利用所需数据凭证证明身份而不必提供其它身份信息。最后对模型的安全性进行了分析。

猜你喜欢
公钥证书身份
WJCI 收录证书
CSCD收录证书
收录证书
收录证书
一种基于混沌的公钥加密方案
神奇的公钥密码
跟踪导练(三)(5)
妈妈的N种身份
P2X7 receptor antagonism in amyotrophic lateral sclerosis
身份案(下)