一种病人可控的电子病历安全访问方案
2020-01-17姚中原斯雪明
潘 恒,潘 磊,姚中原,斯雪明
1.中原工学院前沿信息技术研究院,郑州450007
2.中原工学院计算机学院,郑州450007
3.复旦大学计算机学院,上海201203
电子病历(electronic health record, EHR)的广泛使用和共享能够有效提高医疗服务的效率和灵活性,特别是与云存储、移动应用结合后,可以全面提升公共医疗的便捷化、智能化、治疗精准化水平[1].然而,电子病历中存有大量病人隐私和疾病治疗等敏感信息.在云环境中,数据集中存储在云上,大大增加了被攻击的可能性,使病人隐私等敏感数据的保护变得更加困难[2-3].这不仅严重影响了智能医疗的发展,而且极易引发医患纠纷[4-5].
电子病历安全共享主要研究以下两个问题:一是要能有效防止未授权实体对病历的非法访问,二是要使病人能够对其自身病历数据进行全程的跟踪和管理,增加医疗服务透明性,防止医患矛盾.在现有的研究中,针对第1 类问题的研究较多,而第2 类问题还未引起足够的重视.实际上,针对一些政府要员、企业高管等特殊人群,其电子病历的隐私一旦泄露,就可能带来严重后果,因此病人在这些情况下要求对自身病历信息的访问有足够的知情权和控制权.
电子病历数量的增加使得分布式存储成为必然,而区块链的分布式账本技术恰好满足这一安全需求.区块链是通过密码技术和多方共识、以区块为单位存储数据、按时间顺序将区块组成哈希链的一种分布式账本[6-7].因为区块链具有分布式、链上数据难篡改、防抵赖、可溯源等特点,所以许多学者将电子病历与区块链技术相结合,为解决电子病历隐私保护等安全问题积极寻找新思路[8-13].
在不同的区块链网络架构下,其安全共享解决方法完全不同.在现有的基于区块链的病历安全共享及隐私保护方法中出现了各种新框架和新模型,这些框架和模型的安全共享及隐私保护等通常是由不同的智能合约来实现的[14-16].例如:文献[2]提出了一个基于区块链的医疗分布式记录管理原型MedRec,采用3 种不同智能合约为患者提供全面的、不可变的日志,保证病患隐私信息的安全性、可用性及多平台的互操作性.GEM 公司联合飞利浦区块链实验室开发了基于以太坊区块链的医疗应用Gem Health.这是一个医疗保健数据共享的区块链基础设施,能提高以患者为中心的医疗服务效率,通过智能合约实现身份认证、数据安全存储和访问控制,解决现有医疗系统无法互信的分享医疗数据等问题[17-18].文献[19]设计了适用于癌症治疗的基于区块链的数据安全共享框架,借助对称密钥管理实现对EHR 数据的细粒度访问控制,但未能充分讨论对称密钥的存储等安全问题.文献[20]根据治愈患者、医生、保险公司人员总结的经验、技能和协作成功率等提出了一个基于熟悉度证明(proof-of-familiarity)的共识算法及联盟区块链方案,但该机制的熟悉度证明共识算法仅采用简单加权实现.文献[21]基于以太坊平台搭建了Fairchain 模型,设计了“注册”和“访问控制”两个智能合约进行远程癌症护理的协作决策,但在共享病历时采用的是将病人私钥传递给授权用户的方法,因此存在安全隐患.
上述研究工作虽然取得了一定进展,但仍存在一些局限.
1)缺少病人对自己病历访问的知情权和控制权.在现有电子病历安全共享方法中,仅有少量文献谈到在病历访问前要知会病人[5,15],而关于如何让病人有效管控自身病历访问的文献就更少了.
2)不同机构间病历的互操作困难.由于区块链账本存储能力有限,通常采用链上账本存储病历关键摘要信息,链下数据库存储病历完整信息的方法.实际上,病人的完整医疗信息可能分散在各个医院和诊所的不同链下数据库中,而跨机构病历的互操作一直是个难点.现有解决方法一般利用多个智能合约将同一病人的不同病历关联起来[5,19-20],但在链下访问时会涉及到链上多个智能合约的运行、多项内容的上链等,其实现难度较大,效率不高.针对上述问题,本文提出一个应用于云存储环境的电子病历安全访问方案HyperEHR,该方案具有以下特点:
1)考虑到访问及存储效率,将病人分为普通病人和有特殊病历管理需求的病人.对于特殊需求病人,利用公钥和时戳等设计了由病人管控的病历安全访问方法,使病人对自己的病历访问有足够的知情权和管控权.
2)关于链下数据的存储问题,采用在云环境下部署星际文件存储系统(interplanetary file system, IPFS)的方法.所有存取访问均由IPFS 存取网关统一进行,这种基于IPFS内容哈希存储和查找方式可有效提高病历的访问效率,且在链下病历访问时不涉及多个智能合约的协同操作和多项内容的上链操作.为保证病历管理的可追溯、不可篡改,可将病历访问的关键操作写入区块链账本.
1 相关技术
1.1 超级账本
区块链可分为许可链和非许可链[22].非许可链是可以随意加入或退出的公链.许可链指节点加入或退出链需要许可,通常必须进行身份认证.根据许可链共识范围是否在一个机构内部,还可以将许可链分为私有链和联盟链.联盟链由多个机构共同参与管理,其中每个机构运行着一个或多个节点.节点间的权限完全对等,它们不需要完全互信就可以直接进行交互,并由对等节点共同记录交互信息.
超级账本(Hyperledger)是目前最具代表性的联盟链,由Linux 基金会于2015年发起,包括4 个子项目:Fabric、Sawtooth LakeIroha、Blockchain-explorer.Fabric 通过易配置的权限管理、可扩展的技术架构、开放的接口、可插拔的组件来为不同应用提供通用开发平台[23-25].Fabric 系统架构包括链码服务(chaincode)、成员服务和区块链服务三部分.其中:链码是扩展的智能合约;成员服务用PKI 和CA 来认证并管理用户身份;区块链服务使用P2P 协议、可插拔共识算法来管理分布式账本.Fabric 节点分为背书(endorser)、排序(orderer)、认可(committer)等不同角色.
1.2 星际文件存储系统
IPFS 是一种分布式文件系统,集成了分布式哈希表(distributed Hash table, DHT)、比特流内容分发协议BitTorrent、自认证文件系统SFS 和分布式版本控制Git 等系统的特点和功能[26-28],其突出优势在于文件的存储和查找方式.存储时先将文件分为相同大小的若干块,再计算各块的杂凑值以构建文件检索表,这样就将各文件块分布式地存放于不同服务器.查找时只需输入文件内容的杂凑值而不必关心文件存储位置,IPFS 系统就会根据文件检索表和内部路由表自动查找并组合各块还原原始文件.此外,IPFS 通过构建集群来管理分布在各处的设备进行统一服务.IPFS 集群可分为私有集群和公有集群.
1.3 智能合约
从广义上来说,智能合约是一段部署在区块链上可以自动触发、自动执行的代码.智能合约存储在区块链上的合约地址中,运行于特定环境(如虚拟机、容器等)内,由用户自己定义编写业务逻辑,通过交易命令触发并调用执行,完成区块链账本上的数字资产管理及其他需要区块链参与的相关功能[29].
本文所采用的Hyperledger Fabric 超级账本的智能合约也被称为链码(chaincode),在安全轻量级的沙箱(docker)中运行,支持Go、Java 等语言.链码的正常运行需要与世界状态(world state)数据库进行状态的获取和交互.此外,Fabric 还引入了多通道(multichannel)概念,使得不同业务在不同通道上运行,确保同通道连接的节点之间进行数据隔离.
2 病人可控的电子病历安全访问方法
2.1 HyperEHR 模型
本文提出的HyperEHR 模型采用联盟链形式,主要包括医院、社区诊所、保险公司、研究所等机构,如图1所示.病人、医院医护人员、研究人员、保险员等个体作为区块链网络的应用用户,可以通过手机APP 或相关的Web 页面来访问与自身相关的内容并处理事务.区块链上仅存储医疗信息摘要及访问日志,而更详细的信息存储于云端.考虑到多家不同机构之间的互操作性和访问效率等,采用私有IPFS 系统进行云存储.存取网关是IPFS 管理服务器,能够存储云端所有医疗数据的分布式哈希表DHT,同时参与病历访问控制过程.
图1 HyperEHR 模型架构Figure 1 Architecture of HyperEHR model
本文根据病人对其病历是否有全程管控的需求,将病人分为普通和特殊两类.无论哪类病人,病历均由病人就医所在医疗机构生成.对于普通病人,为了保证病历的安全,医疗机构在上传病历时制定了基于属性的病历访问控制策略,征得病人同意后将访问策略和病历数据同时上传至IPFS.在IPFS存储时,将访问策略、病历数据作为不同文件分为若干块存储在云端不同服务器上,同时将病人ID、病历ID、病历摘要、访问控制策略摘要等关键信息杂凑后存储在区块链网络各机构账本中.
当某机构用户(保险公司业务人员、研究机构人员、医院医生等)需要申请某病人病历时,首先向所在机构发出申请,机构审核请求者身份等信息.如果同意,则转发申请至IPFS 管理服务器.IPFS 管理服务器首先恢复访问控制策略,如果满足,则恢复病历文件,这样所有病历均通过IPFS 系统存储而不必存储在本地.根据IPFS 的存取特点,可以保证文件的存取效率,同时实现跨机构的病历访问.此外,上述文件的请求和反馈等访问过程均存入区块链,以保证病历访问的可追溯、不可篡改等特性.
本文重点研究特殊需求病人对病历的管控访问方法,因此对普通病人病历的管理方法论述不多,具体内容可参考访问控制策略[30-32]及病历结构[33]等相关文献.
本文提出的HyperEHR 模型主要包括4 部分功能.
1)本地病历管理
病人就医后由医院等医疗机构生成病历,用病人公钥对病历加密后上传至IPFS 管理服务器,并销毁在医疗机构本地存储的病人病历.
2)云端病历管理
IPFS 管理服务器负责云端存储,包括将加密后的病历分块、杂凑、存储、访问等工作.
3)病历访问
特殊病历请求者向请求者所在机构发出病历请求,所在机构审核同意后向IPFS 服务器发出病历申请,IPFS 管理服务器审核通过后向病人发出申请.若病人同意,则向IPFS 提交病历访问请求,IPFS 将查询DHT 表还原加密的病历反馈给病人,由病人用自己的私钥解密后反馈给病历请求者.这个过程如图2所示.
4)区块链存证
上述医疗机构、所在机构、IPFS 管理服务器的所有访问操作都将存储在区块链的各个账本中.
图2 病人管控的电子病历安全访问流程Figure 2 Working flow of patient-controlled security access for EHR
2.2 访问方法
本文所提出的方法构建在Hyperledger Fabric 环境中,假设系统所有机构、用户均通过认证,并拥有公私钥对.机构以及IPFS 服务器之间互相拥有对方的公钥,且各机构和病人均信任IPFS 服务器,如图3所示.为了简化,在图3中仅画出成功访问后上链的部分.
图3 病人可控的安全访问方法Figure 3 Patient-controlled security access method
步骤1访问者R向所在机构DEP 发起病历访问请求.
其中,R={IDR,IDP,IDDEP,Rpk,RMR,r,t0},包括发起请求者IDR、病人IDP、机构IDDEP、请求者公钥Rpk、请求病历内容Rmr、请求原因r、发起请求的时间戳t0.为了防止请求内容被篡改,将ReqMsg 进行杂凑,并将杂凑值用请求者私钥进行签名.
步骤2机构DEP 收到请求后,利用请求者公钥Rpk验证签名以核实请求者身份,重新计算ReqMsg 杂凑值进行数据完整性认证.根据请求者提供的查看病历原因r,判断是否允许同意请求.如果同意,则生成票据T={IDR,IDDEP,IDP,Rpk,Valtime,t1}.其中,Valtime为该票据的有效时间,t1为机构DEP 更改的新时间戳.接着,使用IPFS 服务器公钥加密后生成ET,发送给IPFS 服务器.否则拒绝请求.
步骤3IPFS 服务器首先以自己的私钥IPFSsk解密获取票据T,同时使用机构公钥进行验证,通过杂凑值对比来保证T来源和内容的可靠性,判断票据是否在有效期.如果票据仍在有效期,则仅将T中时间戳修改为当下时间t2.接着,IPFS 服务器用自己的私钥和病人公钥重新生成E∗T,并将E∗T传给病人.否则拒绝请求.
步骤4病人以自己的私钥Psk解密获得T,同时利用IPFS 的公钥验证T的完整性.如果同意请求者访问,则向IPFS 发出获得自己病历请求GET_EMR 消息.这里为了区别,将加密后的病历用EMR 来表示.否则拒绝请求.
步骤5IPFS 返回加密后的病历给病人,病人用自己的私钥解密后还原原始病历,并用请求者公钥加密后发给请求者
3 方法及分析
3.1 方案实现框架
本文提出的模型在实现的过程中分为3 层,如图4所示.其中:数据层主要包括链下和链上数据库,即链下IPFS 系统的分布式云存储和链上基于Hyperledger Fabric 构建的区块链账本.业务层主要实现病历安全存储和访问功能,包括传统的Web 及手机端的医疗数据管理,用于医疗机构、其他机构相关人员、病人的注册、日常信息访问等.基于IPFS 系统的云存储管理程序以及区块链智能合约负责病历信息的链下存取以及对病历关键信息和关键操作的链上存证.与用户交互的界面层,可以实现用户通过Web 或手机界面查看和输入相应信息的功能.病人既可以通过界面管控自己的病历访问、输入密钥、进行授权等操作,又可以查看自己的完整病历信息以及追溯病历访问历史;医疗机构人员及其他人员可以通过界面进行病历上传、请求、下载等操作.
图4 HyperEHR 实现框架Figure 4 HyperEHR implementation architecture
3.2 HyperEHR 区块链网络实现方法
HyperEHR 采用Hyperledger Fabric 架构实现,其区块链网络如图5所示.HyperEHR包括为交易排序并打包的order 节点及医疗机构、病历请求机构、IPFS 服务器.每个机构均部署Fabric CA,为其下节点生成公私密钥对并颁发证书,其中Order CA 为上级CA.
图5 HyperEHR 区块链网络实现框架Figure 5 Network implementation architecture for HyperEHR blockchain
为简化实验,在阿里云上搭建4 台主机进行模拟,其中两台模拟病人节点,一台模拟请求者,一台模拟IPFS.4 台主机配置均为4 核、8 G 内存、Ubutu16.04 操作系统,数据库使用LevelDB,系统采用solo 共识协议.设计两个通道以及病历管理和病历访问两个智能合约,其中合约由Node.js 实现,部署在所属通道节点上,如表1所示.
表1 通道业务表Table 1 Channel of transactions
本文所提出了特殊需求病历安全访问算法中所涉及的、由请求机构向IPFS 服务器提交的病历请求,其数据结构如下:
其key 值由Prefix 名和ID 组成,value 属性中UUID 用来标识病历请求类型、请求者或应答者的身份.其中,病历请求类型分一般和特殊两种状态.当申请被接受时,触发通知病人审核,同时启动区块链各节点的背书、共识、认定等操作后在区块链上增加新块.其对应的算法简要描述如下.
由病人向IPFS 服务器提交的病历请求,其数据结构如下.
其key 值由Prefix 名和其ID 组成,value 属性中UUID 用来识别病历请求类型、请求者或应答者的身份.其中,病历请求类型分一般和特殊两种状态.当申请被接受时,同时启动区块链各节点的背书、共识、认定等操作后在区块链上增加新块.其对应的算法简要描述如下:
3.3 性能分析
本文所提出的HyperEHR 方案采用基于Hyperleger Fabric 联盟链以及云存储架构,与其他以太坊等区块链架构相比,其扩展性较好,容易实现机构以及用户的扩展.相比于现有方案,HyperEHR 具有IPFS 的存取特性,因此实现不同机构用户对医疗数据的互操作效率较高.
医疗数据的安全性针对普通用户和特殊用户两类.对于普通用户来说,基于区块链、IPFS存储的安全性比一般系统更高.对特殊用户来说,病历数据生成后通过用户公钥加密上传.只有用户同意并采用自己的私钥解密,才能获得病历信息,因而保证了其隐私数据的安全,以及病人对自身病历的可控性.
从效率上讲,虽然公钥加密的效率不高,但HyperEHR 将用户分为普通病人和特殊病人两类,从总体上来说需要公钥加密病历存储的特殊需求病人占比不大.
本文将所提出的HyperEHR 与现有文献进行对比,如表2所示,可以看出本文方法除效率外,在各方面的性能均有所提高.
表2 不同方案对比Table 2 Comparision of different schemes
4 结 语
电子病历的广泛应用可以有效提高医疗水平、用户体验,并降低相关费用.然而,如何保证电子病历的安全仍然存在很多问题.其中,以病人为中心的电子病历安全共享是防止医患矛盾且保护病人隐私的一个重要研究方向.政府要员、企业高管等特殊人群的病人通常需要有足够的知情权和控制权,但现有文献对该问题研究得不够充分.本文主要针对这一问题,设计了一个基于联盟区块链和IPFS 的由病人管控的电子病历安全共享方案.该方案可以将有特殊需求病人的病历完整信息加密存储在链下,将其关键病历信息及访问信息存储在区块链上,较好地实现了病人严格控制下的电子病历安全访问以及不同机构对电子病历互操作的目标.下一步的研究工作是实现方案中IPFS 的云存储.