邓小鸿,朱年红,黄 磊,王智强,王俊彬
1.江西理工大学 应用科学学院,江西 赣州341000
2.江西理工大学 信息工程学院,江西 赣州341000
互联网和移动应用的飞速发展,产生了大量涉及各行各业的应用系统,人们越来越习惯通过计算机或移动设备享受社交、理财、购物等应用系统带来的便利。通常情况下,人们需要进行虚拟身份登录以便获取所需的服务。然而随着系统应用的多元化发展,人们在每一个系统登记的独立身份信息越来越多,并且为了安全性考虑,很多系统要求用户设置的密码越来越复杂,造成记忆难度增大。越来越多的身份信息意味着管理难度增大,维护成本增加,忘记或者遗失身份信息给人们造成较大的困扰。因此,对用户在不同系统留下的身份信息进行安全管理具有重要意义。
现有的身份管理都在中心化存储环境下,用户的密码经哈希加密存储在系统对应的中心化数据库中,登录的时候将用户提供的密码哈希加密之后再与数据库中的数据比对登录。这种身份托管机制在实际应用中面临以下几个问题:(1)用户数据由服务器完全掌控,服务器出现问题将导致用户数据丢失;(2)各个系统的信息形成数据孤岛,难以交互,且有中心化系统带来的数据泄露风险;(3)同一个用户在登录不同系统的时候都需要进行繁琐的账号密码验证过程,不同的应用系统都需要为此维护一个用户账号数据库,对中心化数据库的频繁访问,加大了数据泄露的风险和运维成本。为了解决同一个用户登录不同应用系统需要进行多次身份验证的问题,研究者们提出使用一个通用账号来登录不同系统。Lin[1]提出了一种基于Chebyshev混沌映射的独立多服务器动态ID认证方案,该方案不依赖于注册中心的存在,每个用户只需要保留一个密码即可访问不同服务器的资源,适用于不可信多服务器环境。在同一域中,单点登录是另外一种登录方案,能够实现在多个系统中,用户登录一次便可以访问所有互相信任的应用系统,这种方式一般使用共享Cookie或Session的方式来实现。例如黄琛等人[2]提出一种兼容多种身份认证的Web单点登录方案,利用ticket代理技术实现兼容多认证方式,并基于证书链信任关系建立认证信任链以实现跨域范围的单点登录,具备高强度的安全性。李小标等人[3]则基于公钥基础设施(Public Key Infrastructure,PKI)和权限管理基础设施(Privilege Management Infrastructure,PMI),服务端以中间件的方式实现认证、鉴权、审计功能,客户端采用安全cookie、共享内存与ticket技术实现跨域单点登录,解决了多模式应用的单点登录问题。这样的登录验证方案可以实现一个账号登录多个系统,但是没有办法同步账号附带的信息。由于缺少一个安全的账号密码存储系统,如果一个系统的密码被破解,那么其他所有使用同一账号的身份信息泄露,存在重大安全隐患。而且使用一个账号登录不同的系统,需要对现有不同的系统进行重构,工作量巨大,而且这种方式不能够存储用户的喜好以及在不同系统的附属信息。
区块链技术是一种去中心化的密码学安全的分布式存储技术。区块链为许多传统行业带来新的应用模式。随着近年来越来越多基于区块链的应用落地,区块链已经成为和人工智能、物联网等并肩的前沿技术。钱卫宁等人[4]针对区块链在可信数据管理方面的研究表明,区块链满足可信数据管理的要求,能为可信数据管理提供一种新的方法。区块链天然的不可篡改、分布式等特性,能够满足身份信息的安全存储要求。因此,本文提出一种基于区块链的身份托管模型。模型使用区块链的分布式存储方案解决了单点失效带来的安全隐患,并使用椭圆曲线签名算法来进行登录验证、接管账号登录和存储业务,有效解决了中心化身份认证存在的问题,并方便用户管理诸多密码和便捷地进行相关系统登录验证。
区块链是一种典型的链式结构,其数据存储在首尾相连的区块中,其存储结果如图1所示。区块通常包含区块头和区块体两部分。以比特币[5]为例,区块头中存储了上一个区块的哈希值、版本号、时间戳、交易指纹、挖矿的难度系数和一个随机数,区块体中存储着交易的详细信息,所有的交易以Merkle树(一种哈希二叉树)的结构存储。这种结构将同一时间段内的交易按顺序排列,每两笔交易串联进行哈希计算得到父节点哈希值,以此类推,最终在树的顶点处得到这一时间段内所有交易的数字指纹,将其存储至区块头,在现有的区块链架构体系中大多保留了这种交易存储结构。区块链网络中的每一个网络节点都存储有完全相同的一份交易数据,这些交易数据与区块链当前的状态和历史记录被存储在LevelDB、CouchDB等键值数据库中。
图1 区块链存储结构
智能合约的概念最早于1995年由学者Szabo[6]提出。智能合约是由参与方共同制定、严格遵守,并在计算机上运行的一串二进制代码,最初是设计用来在没有可信第三方情况下,保证事先定义好的合约条款,以计算机程序的形式如约运行。受限于当时计算机技术发展缓慢,智能合约难以找到足够安全可靠的运行环境,因而没有得到进一步的发展。比特币系统的出现,带动了区块链技术的发展,而智能合约在区块链的实现促进了区块链在各种场景的应用。智能合约的实现,本质上是通过赋予对象(如资产、市场、系统、行为等)数字特性,即将对象程序化并部署在区块链上,成为全网共享的资源,再通过外部事件触发合约的自动生成与执行,进而改变区块链网络中数字对象的状态(如分配、转移)和数值[7]。欧阳丽炜等人[8]提出了由基础设施层、合约层、运维层、智能层、表现层和应用层组成的智能合约基础模型,很好地归纳了智能合约的特点。Christidis等人[9]对智能合约在物联网方向应用的研究表明,区块链和物联网通过智能合约融合,可以在多个行业实现重大变革转换,为新的业务模型和新颖的分布式应用铺平了道路。以太坊是最早支持智能合约部署的区块链架构之一。Cruz等人[10]提出一个智能合约实现的基于角色的访问控制,使用区块链标识访问控制中的信任和认可关系,在以太坊智能合约平台已经构建实现。同样的还有张帅等人[11]在以太坊智能合约平台部署的众筹智能合约,实现了众筹项目的自治化和可靠性,而且提高了项目可信性和公信力。图2给出了智能合约的工作原理,在区块链网络中,智能合约在每个节点的一个独立空间运行,智能合约负责区块链网络的权限控制,对区块链数据的存储,以及对数据的访问,只有满足智能合约的条款才能对数据进行操作。另外,智能合约也是区块链网络与外界交互的接口,一般提供区块链内部访问SDK等,便于用户获取链上数据。
图2 智能合约原理图
RSA是目前应用最普遍也是最经典的非对称加密算法,在智能卡远程口令认证[12]、电子现金[13]等领域被广泛使用。RSA算法的安全性由对极大整数做因数分解的难度来决定。一般来说,只要RSA算法的密钥足够长,那么用RSA算法加密的信息是无法被破解的,与此同时密钥过长带来的问题是加密计算量过大,导致速度慢。
椭圆曲线加密算法(Elliptic Curve Cryptography,ECC)被认为是RSA的替代算法,因其更高的安全性,更短的密钥长度,所以具有更高的安全强度,例如160位ECC与1 024位RSA、DSA有相同的安全强度,同时计算量小,私钥处理速度快,存储空间占用小,适用于内存受限的设备[14]。这些优点使得ECC具有广阔的应用前景。比特币底层的区块链就使用了ECC算法来生成密钥,现在大多的区块链架构如Hyperledger Fabric等也将ECC算法用于背书签名等场景。非对称加密的解密过程通常计算量大,椭圆曲线算法本就比RSA算法计算量小,而一些资源受限的物联网设备,计算能力通常有限,Lara-Nino等人[15]提出ECC算法的轻量化标准,并确定了实际应用解决方案,使其可以更好地在物联网小型设备上工作。
本文使用椭圆曲线数字签名算法(Elliptic Curve Digital Signature Algorithm,ECDSA)来实现登录验证。设公钥、私钥为Pk、Sk,对明文M进行椭圆曲线签名,算法流程如图3所示。
图3 椭圆曲线签名算法流程
发送方对明文信息签名,过程如下:
(1)使用SHA算法生成明文M的消息摘要H(M);
(2)使用私钥对消息摘要H(M)签名,得到签名结果为一对大整数S(r,s);
(3)将明文M和签名结果S(r,s)发送到接收方。
接收方对签名进行验证,过程如下:
(1)对明文M进行哈希运算得到H1(M);
(2)使用发送方的公钥Pk对签名S(r,s)进行验证,得到哈希值H2(M);
(3)若H2(M)=H1(M),则签名验证成功,即证明明文M属于发送方,否则验证失败。
基于区块链的账号托管模型,主要由账号存储系统和身份验证两部分构成,分别解决身份存储管理和身份认证两个关键问题。其中账号存储系统使用区块链搭建,身份验证采用椭圆曲线签名算法实现。
根据区块链应用的基本框架,结合身份托管的流程,设计了基于区块链的身份托管原型系统,其结构如图4所示。
(1)应用层和合约层的交互
图4 身份托管系统结构
用户在应用层对身份信息进行非对称加密签名,将签名发到区块链。智能合约提供身份上链服务,将签名信息保存到区块链。在用户登录的时候,合约使用公钥对签名信息进行验证,返回结果。同时,智能合约还负责区块链上所有的数据状态监控和管理,将状态改变和交易背书信息记录在账本中。
(2)共识层
分布式系统节点众多,决策权分散,难以达成共识,区块链中的共识层解决了这一问题。在身份托管系统中,应用层和合约层是业务处理核心,负责将身份信息正确地传到区块链中,而共识层将这些身份信息按照共识算法进行统一,依次打包同步到区块链网络中的所有分布式节点中,保证数据的一致性。
(3)数据层
在身份托管系统中,每一组身份信息存储在区块链中被视为一笔交易,按照时间顺序存储在账本数据库中。每一定量的交易被打包成一个区块,链接到前一区块,由此形成一条记录历史数据的完整区块链,不可篡改且可追溯。
(4)网络层
区块链中每一个节点都是平等的,因而节点间通信采用对等网络(Peer to Peer network,P2P网络),以扁平式拓扑结构相互连通,不存在中心化的特殊节点。P2P网络使用的是Gossip数据分发协议,能够优化区块链网络性能,满足区块链网络安全可靠、可扩展的要求,并且保证数据分发的完整性和一致性。在身份托管系统中,网络层保障节点间的共识通信和数据分发。
身份信息区块链存储结构如图5所示。
图5 区块链身份存储结构
其中每一组身份数据均至少包含表1所示的三部分。
表1 身份信息区块链存储结构
在身份托管系统中,交易ID被用来查找一组唯一的身份信息,对应一个系统唯一的一个用户身份。身份信息是存储在区块链中的一个用户身份明文信息,用来与公钥对签名验证的结果进行比对来确认用户的身份。签名信息是使用非对称加密对一组身份信息的签名结果信息,用户登录系统使用公钥对其进行验证。
本模型涉及到的区块链账本操作均通过智能合约完成。智能合约主要完成两部分功能:身份信息上链和身份信息验证。
身份信息上链的智能合约如下所示:
Input:(1)Username(用户名);(2)Password(密码);(3)Sys-Token(系统标识);(4)Signature(签名结果);(5)Operation(合约操作符)
Output:(1)InvokeResult(合约调用结果)
1.InputData←PackageInfo(Username,Password,SysToken,Signature);//打包所有准备上链的信息为固定格式
2.ArgsValidation←CheckArgs(InputData);//检查参数函数,返回检查结果
3.IdentifyToken←GenerateIdentifyToken(Username,Sys-Token);//将用户名和系统标识整合为一条身份标识
4.Function ChaincodeInvoke(Operation,InputData);//开始调用合约
5.if Operation=Storage;//合约操作确定为存储操作
6. ArgsValidation=CheckArgs(InputData);//先检查用户名、签名等信息的合法性
7. if ArgsValidation=True:
8. StorageAccount(IdentifyToken,InputData);//以[身份标识:账号信息]键值对存储到区块链
9. Return InvokeResult←上链成功;
10. else;
11. Return InvokeResult←上链失败;
12. end if
13.end if
身份验证智能合约如下所示:
Input:(1)Username(用户名);(2)SysToken(系统标识);(3)PublicKey(公钥);(4)Operation(合约操作符)
Output:(1)InvokeResult(登录验证结果)
1.ArgsValidation←CheckArgs(InputData);//检查参数函数,返回检查结果
2.IdentifyToken←GenerateIdentifyToken(Username,Sys-Token);//将用户名和系统标识整合为一条身份标识
3.Username,SysToken,PublicKey←SeparateArgs(Input-Data);//验证参数拆解函数
4.HashData←Hash(Password);//哈希加密函数
5.DecryptoData←Decrypto(PublicKey,Signature);//公钥验证签名返回结果
6.Function ChaincodeInvoke(Operation,InputData);//开始调用合约
7.if Operation=Verify;//合约操作确定为验证操作
8. ArgsValidation=CheckArgs(InputData);
9. if ArgsValidation=True;
10. Username,SysToken,PublicKey=SeparateArgs(InputData);//拆解参数得到用户名、系统标识和签名
11. IdentifyToken=GenerateIdentifyToken(Username,SysToken);
12. Password,Signature=QueryData(IdentifyToken);//从区块链查询身份和签名信息
13. HashData=Hash(Password);
14. DecryptoData=Decrypto(PublicKey,Signature);
15. if HashData=DecryptoData;
16. Return InvokeResult←验证成功;
17. else;
18. Return InvokeResult←验证失败;
19. end if
20. end if
21.end if
为了测试所提出基于区块链身份托管模型的可行性,使用Hyperledger Fabric联盟链架构搭建账号存储系统,使用椭圆曲线签名模拟验证登录,设计并实现了一个基于区块链的身份托管系统。实验思路为:将用户在不同应用系统的多个账号使用椭圆曲线签名存储在区块链中,在登录应用系统时,区块链网络通过使用用户提供的公钥来检验签名的合法性,并将检验结果返回给应用系统,以此实现用户的登录验证。实验机器配置为系统macOS10.14.5,处理器1.8 GHz Intel Core i5,内存8 GB,1 600 MHz DDR3。实验环境为Hyperledger Fabric1.4。使用Golang编程语言完成椭圆曲线签名和智能合约验证算法。
在局域网中模拟6个区块链节点,代表6个不同的组织,同一组织下有若干应用系统,以初始两个组织为例进行说明,设计组织架构如表2所示。
表2 区块链组织
组织中包含的初始节点如表3所示,每个组织各包含两个初始节点,分别为主节点、备份节点。主节点兼背书节点,对区块链上的每一笔交易进行背书。新增加的节点通过CA服务器发布证书,连接区块链网络。
表3 区块链节点
设定好组织和节点之后,创建配置文件,写入创始块配置和账本配置,然后根据配置文件生成系统组织架构。区块链的第一个区块称为创始块,Hyperledger Fabric中的第一个区块是需要手动生成的,因此需要定义一个配置文件来写入初始配置信息,并由此生成创始块。准备证书和创始块完毕之后,就可以启动节点了,然后安装智能合约到节点中。所有的操作通过Hyperledger Fabric提供的5个模块命令cryptogen、peer、orderer、configtxgen、configtxlator来完成。
身份信息上链过程如图6所示。假设某用户在应用系统System1中的账号是“znh”,密码是“ZHU1234567#”,在应用系统System2中的账号是“zhu01”,密码是“pick987456”,使用该用户的一对密钥对密码签名并存储到区块链系统。
图6 身份信息上链
(1)用户获取密钥对
通过Golang提供的ecdsa包编写密钥生成程序模拟密钥分发机构,获得一对公钥和私钥,并将它们使用pem编码分别保存在公私钥文件中,由用户保存到磁盘,内容如下。
私钥:
-----BEGIN ecdsa private key-----
MHcCAQEEIKDKHMK7rxKeM6MJLdtM7K21SgLwhY FQ946Gbz+a/tO1oAoGCCqGSM49Aw EHoUQDQgAEPeSyb YXmje9w4vC9bOz9aFoYNr+1TjkqK535Car11Qs5rjWExRmm
3rkY9ID/FhuNOM4avOUw4DsyCm4uNH5HhA==
-----END ecdsa private key-----
公钥:
-----BEGIN ecdsa public key-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEPeSy bYXmje9w4vC9bOz9aFoYNr+1
TjkqK535Car11Qs5rjWExRmm3rkY9ID/FhuNOM4avOU w4DsyCm4uNH5HhA==
-----END ecdsa public key-----
(2)对密码签名
用户分别对系统System1和System2的密码进行哈希运算得到散列值,用户用私钥对该散列值加密运算得到签名S(r,s),r和s是一对大整数。然后将签名S和账户密码发送给系统。
(3)身份信息上链
系统将签名S、账户密码Password加上自己的系统ID(SysToken)发送到区块链网络,智能合约对其进行验证并保存,结构如下所示。
1.{
2."_id":"system1_znh",
3."_rev":"2-ccb581de9d1b0e17b53b9b74e605809d",
4."Password":"ZHU1234567#",
5."SysToken":"system1_znh",
6."r":"4DDD135559679110647118042865DDDDDD55 11146286028623055625653706849051060181145122657883",
7."s":"7905390495780267907304610411337128067536 1090163383359880313399688887901448672",
8."~version":"u0000CgMBMgA="
9.}
其中id为系统Token和用户名组合而成。Password为用户密码明文,r和s为用户对密码私钥签名得到的两个大整数。
以用户登录系统System1和System2为例,分别使用System1和System2的用户名和公钥通过区块链进行登录验证。登录验证流程如图7所示。
图7 登录验证流程
(1)用户发送公钥和用户名给系统。
(2)系统将用户名、系统Token(系统的唯一标识符)用下划线拼接为身份索引id发送到区块链网络。
(3)智能合约根据id查询到相应的密码,使用公钥对签名验证。过程为:智能合约对密码进行哈希运算得到散列值,智能合约使用公钥解密签名获得散列值,两者进行对比验证,将结果返回给应用系统。
(4)客户端收到结果,验证成功则登录成功,否则登录失败。
实验完成了一个基于区块链的身份信息存储系统,并模拟了使用公钥验证椭圆曲线签名来登录应用系统的过程。验证了用户通过一对密钥来登录不同应用系统的可行性,从而解决了用户面对不同应用系统需要记住大量账户密码的问题。
(1)安全性分析
Hyperledger Fabric是一种联盟链架构,对数据的访问操作全部通过智能合约控制,只要在智能合约中设置合理的权限,数据就无法被非法访问,这样就保证了区块链数据的安全。在区块链之外,由于用户是使用账号和公钥来登录系统,不需要暴露密码,因而不存在密码泄露的安全问题。基于区块链的身份托管模型的安全性主要依赖区块链系统的安全性。对区块链的攻击有两方面:一是对区块链系统可用性的攻击,恶意使区块链停止处理交易;二是对区块链智能合约的攻击,利用智能合约的规则漏洞产生恶意的交易,这也是破坏性最大的攻击。本实验基于最小原型区块链系统设计的智能合约主要分为两部分功能:数据存储和登录验证。数据存储严格按照格式存储,登录验证为签名的解密过程,只要设计合理的校验函数,就能规避利用智能合约被攻击的风险。
(2)性能分析
性能不足是区块链面临的挑战之一。区块链的性能指标主要有交易吞吐量和交易时延两个。交易吞吐量是指在固定时间区块链网络能处理的交易数量,而交易时延是区块链对交易的响应和处理时间。本实验使用Caliper对身份托管系统中的区块链网络进行综合性能测试,从数据存储和数据查询两方面,得到相关测试数据,如表4所示。
相对于比特币每秒7笔交易的吞吐量,本实验搭建的区块链网络吞吐量为存储操作每秒13.2笔交易,查询操作每秒51.4笔交易,有一定的提升,但是在面对高并发登录的情况时,有待进一步改善。
智能合约控制着区块链数据的存储和查询,其运行效率直接决定数据交易处理的性能。本实验使用Benchmark测试框架单独对智能合约进行压力测试。一共进行5轮测试,每轮的加密签名过程测试10 000次,验证签名测试5 000次,得到每次加解密操作的耗时数据,绘制折线如图8所示。
由实验数据可知,每次签名操作耗时平均为113.721 2 ms(约0.000 11 s),每次验证签名操作耗时平均为278.803 2 ms(约0.000 28 s)。相对来说解密操作比加密操作耗时,但这两种操作均低于1 ms,具有较高的时间效率。
表4 区块链网络性能指数
图8 智能合约加解密性能
(3)可行性分析
基于区块链的身份托管系统模型主要由区块链存储系统和登录验证流程智能合约组成。区块链存储系统基于Hyperledger Fabric已经实现,以Golang开发的智能合约对签名进行校验,能正确地验证用户身份信息,结果表明是可行的。由于应用系统的复杂多样性,实验只模拟了在客户端用户对密码进行加密签名的过程,实际应用可以在系统中增设一个加密接口,用来对密码签名。区块链登录接口可以使用中间件或者微服务的形式实现。这些都有成熟的技术架构,能够很好地满足需求。基于以上分析,本文提出的区块链身份托管模型是可行的。
本文提出了一个基于区块链技术的身份托管系统模型,将用户的账号密码存储在区块链之后,用户仅需使用用户名和同一个公钥即可完成不同应用系统的登录校验,为应用系统的访问提供一种新的身份验证模式。实验过程设计了基于区块链的身份存储数据结构,以及相关智能合约,完成对身份信息的存储和校验,在登录验证环节,采用椭圆曲线签名算法进行账号验证,解决了一个用户需要记住多个不同应用系统不同密码的问题。本文实验模拟登录部分,是在本地局域网环境完成,实际应用可能会有高并发的请求,因此可将智能合约使用公钥验证签名部分转移到中间件接口,以降低高并发的计算量,减轻区块链网络压力,加快登录验证过程。以上问题将在后续研究中进行深入探索。