刘 宇,陈 哲,李孟恒,覃团发
1.广西大学 计算机与电子信息学院,南宁530004
2.广西多媒体通信与网络技术重点实验室,南宁530004
随着智能医疗[1]的蓬勃发展,无线体域网被广泛应用到智能医疗中[2-3],用户穿戴各式各样的传感器设备,这些传感器会在体域网中相互连通,协助人们完成数据采集、数据加密和数据传输等工作。由于采集的数据遍布全身且过于分散,传统体域网通常采用依赖汇聚节点的星型网络连接[4-5],在这种连接方式下,一旦汇聚节点被攻破,其中的用户隐私数据就会泄露甚至被攻击者篡改,继而引起医疗上的错误诊断。另外,对于暴露在外界的体域网来说,数据通常是在公开信道中进行传输的,如果这些数据不加密将会很容易遭到劫持和篡改,因此提高传感器节点在体域网中的安全性,是当前亟待解决的问题。
为了保护这些与个人隐私相关的生理数据,许多研究者都提出了相关的安全机制,大体上都包含了身份认证和信息加密。文献[6]提出了利用PUF函数实现会话双方的双向认证和秘钥交换,遗憾的是该方案为了降低执行开销而放弃了散列函数,使得接收方无法校验加密信息的完整性。文献[7]提出利用心电信号来分配传感器的秘钥,但前提是所有的传感器都得检测到心电信号,这一方法限制了传感器的位置分布,同时增加了硬件复杂度。文献[8]提出了一种体域网轻量级协议,该协议能实现传感器匿名相互认证,然而却被文献[9]的研究者发现该协议易受到传感器节点模拟攻击和集线器节点欺骗攻击。针对上述问题,本文提出了一种基于联盟区块链的体域网信息安全应用,采用IBM贡献的开源项目Hyperledger Fabric(以下简称Hyperledger)搭建联盟区块链,将用户身上每一个传感器都作为区块链节点,通过成员服务提供商(Membership Service Provider,MSP)对节点身份进行管理,只有经过认证的节点才能加入到通道子网中,确保了用户数据的隐私性,再利用Hyperledger分布式记账[10]的特点来保证医疗数据不可篡改。针对体域网汇聚节点易受攻击的问题,本文还提出了一种传感器节点间安全通信的新方式,将传感器通信转移至区块链上,交由区块链节点进行通信,使通信过程更可靠、更安全。
现有的区块链分为公有链、联盟链和私有链三种。公有链是一种全公开的区块链[11],任何区块链节点都可以接入到公有链中,其中的交易信息和交易记录对所有节点都是公开透明的,每一个区块链节点都包含全网的所有交易记录,且网络中不存在任何中心化的节点,但因为所有节点都加入到一条链上,所以它处理交易的速度很慢,代表网络有比特币和以太坊。不同于公有区块链,联盟链并不是全公开的区块链,联盟链通常是由同行业的许多机构共同构成。联盟链有严格的身份管理机制,联盟的数据对外不可见,保证了数据的隐私性。私有链则是一种完全封闭的区块链,通常由企业内部搭建而成,权限的管控相比于联盟链来说更为严格,因此隐私性相比于前两者来说更高,交易的处理速度也更快,但相对也更加中心化。通过上述对比,公有链公开透明的特点不利于保护体域网用户的隐私数据,且冗杂庞大的全网交易记录对于体域网来说是沉重的负担,过长的交易同步时间也是体域网无法忍受的。私有链更加偏向于中心化,适合企业内部搭建使用,而本文需要将用户的传感器、不同医疗机构的区块链节点联系在一起,需要多方机构共同协作,应用部分去中心化的联盟链更为合适,因此本文最终选择了联盟区块链作为体域网的应用。
本文采用区块链来管理体域网,分布式的区块链需要达成一个一致的结果,因此需要根据体域网的特点选择合适的共识算法。区块链目前可以考虑的几种共识算法里面,工作量证明(Proof of Work,PoW)是最常见的一种[12],它要求参与共识的节点解决复杂难题求出hash值,某一节点找到正确的hash值就可以生成一个新的区块进行全网广播,但缺点是解决复杂难题需要很长时间,耗费资源太多,不适合体域网。权益证明(Proof of Stack,PoS)[13]则像是股票一样,持有股权越多、持有时间越长的节点,它的话语权就越大,通常联盟区块链节点规模远不如公有区块链庞大,因此这类节点很有可能最终演化成中心化节点,形成安全隐患。Kafka共识[14]可以接受区块链上少于1/2的节点故障或失效,这对于体域网中有故障风险的传感器来说十分友好,且耗费资源远低于PoW和PoS共识算法,因此本文选择使用Kafka共识。
区块链节点对账本的更新称为一次交易,经过哈希函数y=hash(x)对交易内容x加密会生成固定长度的哈希值y,通过y不能反解出x,且不同的x和x'经过哈希后几乎不可能生成同样的哈希值y,因此哈希函数非常适合用于检验内容x的完整性。在区块链中,每一个区块都有上一个区块的哈希值,哈希值包含着区块中的信息,因而能保证数据难以被篡改。
非对称加密就是采用公钥和私钥进行加解密,私钥由自己保管,公钥散发到外部,且公钥和私钥是成对存在的,公钥可以解密私钥加密的内容,反之私钥也可以解密公钥加密的内容。
本文采用椭圆曲线加密算法,该算法是基于椭圆曲线上点群离散对数难题设计的。假设p为大于3的素数,椭圆曲线y2=x3+ax+b,其中a、b为常数且满足4a3+27b2≠0mod p,P1=(x1,y1)与P2=(x2,y2)是双曲线上的两点,O为无穷远点。定义该椭圆曲线的加法和减法:
其中横坐标满足x3=m2-x1-x2,纵坐标满足-y3=
由上述公式可知椭圆曲线上两点相加,得到的点仍在椭圆曲线上,因此可以考虑假设两个点P和Q在椭圆曲线上。在等式kP=P+P+…+P=Q中,已知k和P由加法公式可以很轻松地求出Q,而如果已知P和Q却很难求出k,因此在本文中k即是签名所需的私钥,Q就是分发出去的公钥。
由于联盟区块链上的所有操作都需要节点签名,本文主要把椭圆曲线算法用于身份认证的数字签名过程当中。假设传感器节点A要发送一段消息m,将消息经过哈希散列函数处理后生成消息的摘要y=hash(m),传感器A用自己的私钥加密消息摘要y并和消息m一起发送给机构节点B,如果机构节点B能用A发布的公钥解开,则证明消息的来源确实是传感器节点A,机构节点B再将消息m哈希处理后得到摘要y',若y=y',则说明消息m没有被篡改过。数字签名过程如图1所示。
图1 数字签名
本文采用非对称加密技术进行数字签名,每个区块链节点可以保证自身的私钥得到妥善保管,但却不能保证发布在外面的公钥没有被其他节点冒充,因此还需要引入证书来帮助管理公钥。证书的原理与签名类似,权威证书颁发机构(Certificate Authority,CA)会在区块链节点的公钥后加入CA的私钥签名形成证书,用以担保该公钥的安全性。每一个区块链节点本地还会存有一套CA根证书,根证书上包含CA的公钥,用以核查颁发的证书是否是经由CA签名的。证书的安全总是可以由上一级的证书来证明,一直追溯到最上级的根证书,形成一条完整的证书信任链,如图2所示。
图2 PKI架构
由于采集的数据遍布全身且过于分散,传统体域网通常采用依赖汇聚节点的星型网络连接。为了解决汇聚节点易受攻击的问题,本文不采用传统体域网的星型网络连接方式,而是将用户的每一个传感器仿真节点都部署到云端服务器,云端采用CentOS 7系统并配置好Hyperledger相关的运行环境,之后就可以部署一个区块链节点,并实现传感器节点和区块链节点的一一对应。这样做的好处一是避免了汇聚节点的存储转发,降低了汇聚节点一旦被攻破将导致用户所有数据丢失的风险;再一个是强化了体域网中传感器的身份管理,当传感器要获得合法的区块链节点身份时,会单独受到更为严格的审查,冒充传感器节点将会变得更加困难。
联盟区块链是同行业的多个机构一起联合搭建起来的,因此仅有用户的传感器节点是远远不够的,还需要医疗机构、保健机构和康复中心等提供大量的区块链节点。本文的整个区块链网络节点架构如图3所示。
本文的联盟区块链节点分为CA节点、Peer节点和Orderer节点三大类。
(1)CA节点是Certificate Authority证书颁发中心,负责用户客户端登记注册和证书颁发,客户端在区块链上的任何操作都离不开CA节点颁发的身份证明。
(2)Peer节点又可以细分为背书节点和记账节点。当客户端发起交易之前,会先发起交易的提案交由背书节点来模拟执行交易,背书节点是由Peer节点中动态选举出来的,因此本文选择将背书的功能交由各类机构和中心的Peer节点来完成,减少传感器Peer节点的负担。记账节点则只是负责同步新的交易到账本上,所有的Peer节点都可以作为记账节点,每个Peer节点都维护一份联盟区块链账本的副本。
(3)Orderer节点也叫作排序节点,负责给新生成的交易进行排序并广播给联盟中的所有区块链Peer节点,通知它们更新自己的账本副本。
身份管理机制是联盟区块链相对于公有区块链最独特的一点,也正是因为有了身份管理机制进而才能实现联盟准入机制,实现隐私数据对外不可见,这对于脆弱的体域网来说非常重要。本文的身份管理由证书与PKI架构实现,一个传感器区块链节点的身份注册过程分为线下和线上两部分,具体的授予过程如图4所示。
图3 区块链网络节点架构
图4 身份注册
用户在线下凭借身份证明向CA机构申请用户名和密码,再在客户端凭用户名和密码在线发送注册请求;CA机构会在数据库中标识该用户名和密码并返回注册证书给用户;用户凭借注册证书再向CA申请TLS证书用于连接本联盟区块链网络;CA核对数据库中是否标识了该注册用户,如果已标识则返回TLS证书给用户客户端。
智能合约[15-16]是一个区块链网络能否正常运行的核心所在,区块链节点通过身份验证后就可以申请加入联盟通道(Channel),第一次创立联盟通道需要为这个联盟通道安装智能合约,智能合约中包含了能实现本文需求的算法。
算法1初始化传感器节点
1.INPUT user_name&&user_id&&sensor_id
2.IF user_id存在THEN
3. IF sensor_id存在THEN
4. break;
5. ELSE加入新的传感器节点
6. END IF
7.ELSE创建新用户&&加入新的传感器节点
8.END IF
算法1输入了用户名、用户id和传感器id,通过初始化传感器节点,可以方便医疗机构节点遍历所有的用户及传感器的信息,并了解到用户的传感器活跃状态。
算法2采集传感器信息
1.给不同类型的传感器设定不同的sensor_type
2.监听用户传感器的sensor_data并记录current_time
3.将信息user_name&&user_id&&sensor_id&&sensor_type&&sensor_data&¤t_time组拼成json
4.IF user_name||user_id||sensor_id不存在THEN
5. break;
6.ELSE将json记入账本
7.END IF
由于智能合约内部不允许直接调用函数返回本地变量和本地时间,因此算法2是客户端采集并传入参数给智能合约记入账本得以实现的。医疗机构可以通过user_id&&sensor_id查询到用户的某个传感器采集到的信息sensor_data,并且该条信息还记录了采集的日期和时间,便于医疗机构做数据统计和分析。
算法3生理结果分析
1.IF user_id||sensor_id不存在THEN
2.return;
3.END IF
4.根据user_id和sensor_id查询该用户某传感器的种类sensor_type和采集到的sensor_data数据
5.根据不同的sensor_type执行不同的生理分析函数,以心率传感器为例:
6.IF sensor_type==heart_rate THEN
7.IF sensor_data<40 THEN
8. 数据分析:用户心率过缓,易造成大脑供血不足,建议及早就医
9.ELSE IF sensor_data>160 THEN
10. 数据分析:用户心动过速,恐有心脏疾病,应避免剧烈运动及早就医
11.ELSE数据分析:用户心率正常
12.END IF
13.END IF
当用户和医疗机构需要分析用户生理数据时,需要提供user_id和sensor_id,得到传感器的不同类型sensor_type和数据sensor_data。根据不同的sensor_type,算法3对sensor_data进行不同的处理,并提供不同的数据分析函数。
区块链节点注册成功之后就拥有了合法身份,并凭借该身份加入联盟通道。联盟通道中通常包含用户的所有传感器Peer节点和若干个医疗机构的Peer和Orderer节点,节点架构如4.2节所述,这些节点联合起来形成一个通道子网络,数据记入账本就是在这个子网络中运行智能合约实现的。以传感器的Peer节点为例,当传感器在某个时间点需要上传生理数据时,节点客户端会发起交易的提案,区块链网络会根据预先设定好的背书策略选定背书节点;背书节点按照智能合约提供的方法模拟执行,完成后会把背书结果和签名返回给客户端;客户端接收到足够的背书结果以后,先核查背书结果是否一致,如果一致再将交易提案、背书结果和背书签名打包成交易信息广播给网络中的Orderer排序节点;排序节点收到交易信息后按时间顺序生成新的区块并广播给通道子网络中的所有Peer节点,通知它们更新账本信息。整个流程如图5所示。
图5 数据记入账本
通过上述过程,传感器节点就可以把采集到的数据写入到账本中,并且该数据还会绑定用户的身份信息和传感器id等信息,其他机构的Peer节点可以通过用户的身份信息和传感器的id在账本中查询到用户的生理数据。同理,其他传感器Peer节点通过应用程序客户端也能查询到该数据,因此可以把传感器之间的安全通信转移到区块链上进行。
体域网中对于生理数据的安全性要求非常高。在体域网中数据安全主要指数据的完整性和隐私性。本文通过以下四点来保护用户的数据:
(1)第3.1节曾提到每一个区块都记录有前一个区块和自身的哈希值,这个哈希值包含了交易的内容,如果交易的内容被篡改了,哈希值会改变,前后区块就会断开,这就防止了用户的生理数据被恶意篡改。
(2)区块链中的每一个Peer节点都会维护一份账本,整个区块链就形成了分布式记账,本文采用的Kafka共识可以容忍小于1/2的节点故障,因此仅仅某一个节点恶意篡改账本上的交易是无法达成区块链大多数节点共识的,这就维护了用户数据的完整性。
(3)联盟区块链中的节点都会进行严格的身份管理和审查,在此之后才有资格加入联盟链的Channel通道中,该通道是封闭式的,只有加入到通道的节点才能发起交易和记账,因此用户的隐私数据对于通道外的节点是不可见的,这在一定程度上保障了用户数据的隐私性。
(4)在Channel通道中还可以通过私有数据Private Data技术进一步提升用户数据的隐私安全,存放在Private Data中的数据可以只针对某些机构组织开放,这些组织可以查看到Private Data中的内容,其他的记账节点只能记录这些内容的加密hash值用于校对。
本文将联盟区块链引入体域网,进一步保障了体域网用户信息的完整性和隐私性。在提高体域网安全性能的同时,也要兼顾体域网的其他特性。由于构成体域网的传感器大多都是随身携带的,因此体域网对于功耗的要求也十分严格,无论采用何种加密算法或是安全机制,体域网功耗都始终是一个绕不开的话题。图6是本文引入联盟区块链到体域网后的心率传感器节点功耗图。
图6 心率传感器节点功耗
图6的每一个峰值代表传感器发起一次交易,可以看到传感器平时处于低功耗的检测状态,需要发起交易时消耗的功率也很小,实际情况下也不会在如此短暂的时间内频繁地发起交易,因此完全符合体域网低功耗的要求。除了对功耗有所要求外,体域网还对传输时延有所要求。图7上面的曲线是一次心率传感器数据上链所需要的时间,下面的曲线是其他区块链节点获取这次交易内容所需时间。
图7 交易时延
可以看到,数据上链所需要的时延在1.5 s左右,数据查询的时延在0.25 s左右,相对于现有的体域网来说,数据上链所需要的时延较高,如果仅仅是传感器节点传输给机构节点,这个结果尚可以接受,如果是两个传感器节点在区块链上相互通信,这个时延还需要降低。通过测试并分析代码,发现在整个数据上链的过程中,交易的背书过程其实很快就完成了,真正耗费了大量时间的是广播交易结果这一个过程,这也是下一步研究的方向,即考虑如何提高广播效率。
本文提出了基于联盟区块链的体域网信息安全应用,通过分布式账本和区块的哈希链保障了用户数据的完整性,防止被攻击者轻易篡改,再通过身份管理和通道子网实现了数据的隔离,一定程度上保护了数据的隐私性,利用私有数据Private Data技术添加查看权限和加密交易结果,进一步维护了用户数据隐私性。在此基础上,本文还通过实验测试了体域网的功耗和时延,论证了该应用是否符合体域网的现实要求。实验结果表明,该应用可以满足体域网低功耗的要求,但在传输时延上还有待提高,证明了联盟区块链应用于体域网以改善体域网的安全性是具有可行性的。下一步就是探究如何进一步降低传感器与传感器在区块链上通信的传输时延。