程泽川 沈苏彬
(1.南京邮电大学计算机学院;2.南京邮电大学通信与网络技术国家工程研究中心 江苏南京 210046)
随着互联网的快速发展和我国新医改政策的出台,电子病历作为一种新型的患者信息载体,已成为医疗服务不可或缺的工具。它被认为是提高医疗服务质量、加速生物医学发现和降低医疗成本的有效方法。电子病历提供的各种范式的模板和辅助工具可以让医生从繁重重复的病历书写工作中解脱出来,专注于患者的病历。此外,电子病历记录了患者的长期健康数据,为医生的决策提供了更多的历史参考,提高了对患者病症诊断的准确性[1]。因此,医疗服务需要一个足够安全和灵活的电子病历管理平台。传统电子病历管理方式是依赖于中心服务器[2-3],电子病历由中心服务器集中管理,这种方式交互方便易于管理,但同时也存在信任危机的问题,基于服务器的传统电子病历管理系统架构受制于传统信任模式,医生等高权限用户的操作缺乏可审计性,无法真正建立用户可信任的电子病历操作的监管机制[4]。
区块链技术[5-6]是一种去中心化的信任管理机制,具有去中心化、不可篡改、基于多方共识的信任机制等特点,由于其显著的特点,这项技术已被应用到了自主交易、行为监管和增强安全方面。此技术可以用来解决基于服务器的传统电子病历管理方式所存在的问题。例如:可以通过区块链上的可信交易定义用户的操作来解决信任危机的问题,将得到验证和信任的可信操作记录在公共账本上[7-8]。由上述可知,基于区块链的电子病历管理技术的研究具有十分重要的价值。
根据国家卫生健康委员会规定电子病历的所有权归患者,但目前基于区块链的电子病历管理技术方案中[9-11],大多都未解决患者无法根据自身敏感性需求细粒度控制电子病历操作权限的技术问题。为了解决这个问题,该文设计了基于患者敏感性需求的细粒度控制方式,并基于以上解决方案设计了与其相适应的去中心化电子病历可信管理方法。最后在以太坊平台上进行了仿真实验验证方法的可行性与正确性。
传统的基于服务器的电子病历管理系统功能全面、交互方便,不仅可以方便医生记录患者病历信息,而且便于医疗人员挖掘数据背后的价值,但对电子病历管理的安全方面缺乏一定的考虑,存在信任危机等亟待解决的技术问题。上述问题随着区块链技术的兴起有了相应的解决思路。目前,国内外将区块链技术应用于电子病历管理的相关技术方案如下,徐捷等人[9]提出基于以太坊的医疗记录安全存储方案,通过设计文件同步合约、授权合约和跨域获取合约保证用户隐私和数据分享功能。薛腾飞等人[10]设计了一种基于区块链的医疗数据共享模型,通过提供传感机制,解决了医学机构之间数据的检查、保存和同步问题。Dagher GG等人[11]提出一个Ancile框架,该框架采用以太坊平台,将电子健康记录的所有权和控制权交给数据拥有者,开发并利用多种智能合约以及采用代理重加密技术来进一步保护电子健康记录的隐私。
通过上述方案分析可知,目前大部分基于区块链的电子病历管理技术方案中尚未解决患者无法根据自身敏感性需求细粒度控制电子病历操作权限的技术问题。因为国家卫生健康委员会规定,电子病历涉及患者个人的隐私敏感信息,信息的所有权一定是归患者所有,要取得电子病历的操作权限一定要经过患者的知情同意。目前,大部分方案中,首先对获得电子病历操作权限的技术方案设计有两种:第一种对电子病历的操作无需经过授权,例如:薛腾飞等人提供的方案;第二种对电子病历的操作权限由患者控制,例如:Dagher GG 等人提供的方案,其控制方案中,如不同主体需要对电子病历的进行操作,会先向患者申请授权,患者将授权码发送给主体,获得授权码的主体拥有对电子病历的操作权限,即可以对电子病历进行查询、增加、修改的操作。这两种方案患者都无法细粒度控制电子病历的操作权限,因为患者细粒度控制电子病历的操作权限是指根据自身意愿对不同主体控制的是不同的具体的操作权限,而目前要么是直接无法控制,要么控制的是不具体的粗粒度的权限,例如:Dagher GG等人提供的方案中获得授权码的主体拥有对电子病历的所有操作权限,并没有根据患者意愿控制具体的操作权限;其次未考虑到患者敏感性需求,疾病作为敏感属性字段具有一定的特殊性,从而决定了不同电子病历对于个人而言敏感程度大不相同且差异性较大[12],例如:传染性疾病电子病历的敏感程度就比非传染性疾病电子病历的敏感程度高,所以患者需要根据自身敏感性控制其他主体对于电子病历的操作,但是目前大部分方案中未根据患者敏感性需求控制电子病历的操作权限。
针对目前基于区块链的电子病历管理技术方案中存在患者无法根据自身敏感性需求细粒度控制电子病历操作权限的技术问题,我们首先研究分析患者敏感性需求和基于区块链的细粒度控制,最后设计了基于患者敏感性需求的细粒度控制方式。
患者敏感性需求,指的是对患者而言,因为不同的电子病历其敏感程度对患者来说是大不相同的,所以不同用户能够访问敏感度高的电子病历还是敏感度低的电子病历,需要患者的知情同意。
接下来对患者敏感性需求所涉及的关键对象如何量化表示进行研究。首先不同病历对患者而言敏感度是不同的,本质是因为病历中所记录的是不同的疾病,所以其实是不同疾病记录对患者而言敏感度是不同的。可以先对不同疾病敏感性进行量化分级。该文选取8种典型且具有明显差异性的疾病为例来进行疾病敏感性的量化分级。参照世界卫生组织的《国际疾病分类》标准来判断疾病的严重程度以及疾病是否属于传染病,将传染病作为高敏感性等级疾病记录为I,其余的疾病根据疾病的严重程度从高到低排序,然后划分为3个等级,记录为II、III、V。
根据上述的疾病敏感性量化分级,对病历敏感性进行量化分级,不同病历敏感性等级与病历记录的疾病敏感性等级大小一致。为了满足患者的敏感性需求,由患者控制不同的用户能够访问敏感性等级高的电子病历还是敏感性等级低的电子病历,对不同用户增加等级属性,并对等级属性进行量化分级。根据患者敏感性需求定义分析中需要注意的两点,普通用户和医生用户是不同的,医生用户是为医疗服务的执行者。对普通用户的等级属性量化分级时,患者按照自身意愿对普通用户的等级属性直接进行分级,普通用户的等级属性根据患者意愿划分出I、II、III、IV 这4 种大小等级。对医生用户的等级属性量化分级时,因为患者本身不具备医疗专业知识,所以其无法判断医生用户是需要访问敏感性等级高的电子病历还是敏感性等级低的电子病历。不同医生负责不同的疾病治疗服务,由医院将医生所负责治疗领域内的最高敏感性等级疾病的级别作为医生用户的等级属性的级别。综上所述,患者敏感性需求可以理解为,当用户访问患者电子病历时,因为要满足患者敏感性需求,其只能够访问病历敏感性等级小于等于自身等级属性级别的电子病历。
细粒度指的是将对象加以细分,从而得到更科学合理的新对象,在此,为对用户访问电子病历的操作对象加以细分,在去中心化电子病历可信管理场景中,将其分为增加、查询和修改这3个新的对象。
细粒度控制指的是根据增加、查询和修改这3 个新对象维度对用户的访问授权进行控制。与粗粒度控制相比,细粒度控制可以减少过度授权(例如使不具备医疗专业知识的普通用户获得修改电子病历的权限)等问题的出现。
基于区块链的细粒度控制是将区块链技术与访问控制机制相结合。在细粒度控制方面可以根据具体的访问控制机制对访问权限和访问控制策略进行定义设计,访问权限所包含的操作维度是细粒度的,分别为增加、查询和修改。利用区块链不可篡改、可追溯等特性,可以将访问权限和访问控制策略等信息存储到区块链上,上链的数据是经过多方共识并验证的,所以可以保证在去中心化的环境中,链上的访问权限和访问控制策略等信息是公开可信的。通过可信的访问控制策略授予可信的访问权限,以此达到基于区块链的细粒度控制。
综上所述,为了满足基于区块链的细粒度控制,需要选择合适的访问控制机制与区块链技术相结合。常见的访问控制机制有[13]自主访问控制(Discretionary Access Control,DAC)、强制访问控制[14](Mandatory Access Control,MAC)、基于角色的访问控制[15](Role-Based Access Control,RBAC)和基于属性的访问控制[16](Attributed-base Access Control,ABAC)。在去中心化电子病历管理场景中,区块链用户间的数据交互大多处于不同的管理域中,因此很难集中制定和管理一套统一标准的访问控制策略。DAC 模型、MAC 模型和RBAC 模型中,区块链用户都需要申请一个身份的标识,这对于不同组织来说管理十分复杂,同时随着区块链用户的增多,需要维护的数据也会持续增加,但ABAC模型则无上述问题,其对于主体、客体和访问控制策略,都采用统一的属性来定义,访问控制策略会根据区块链用户的属性进行统一的处理,无需关注区块链用户所处管理域和其具体的身份,只要区块链用户属性满足访问控制策略就可获得权限,因此ABAC 更适合去中心化电子病历管理,所以可以选择基于属性的访问控制机制作为基于区块链的细粒度控制中的访问控制机制。
通过上述研究分析确定了患者敏感性需求和基于区块链的细粒度控制,接下来将其结合设计基于患者敏感性需求的细粒度控制方式。首先,确定控制方式所涉及的相关实体,包括主体、客体、权限、客体拥有者、客体所有权拥有者、环境;其次,确定属性,包括实体属性和环境属性;最后,确定访问控制策略。
主体为电子病历的访问者。客体为电子病历。权限为主体可以对客体进行的操作。客体拥有者为医院节点。客体所有权拥有者为患者节点。环境为不同实体所参与的区块链交易。
将用户等级作为主体的属性值,医生主体等级由医院私钥加密,患者代理主体等级则由患者私钥加密,主体属性值还包括其对客体所请求的具体操作和其发起请求的签名,以及自身的虚拟ID。客体的属性值为病历敏感性等级,病历敏感性等级由患者私钥加密,并且与统一的疾病敏感性等级相对应。权限的属性值为P={p1,p2,…,pn},表示主体可以对客体所做操作的集合,集合元素为具体的操作,由患者私钥加密。环境的属性值为不同实体在区块链交易中的对应关系。上述不同实体的属性值由相关实体私钥加密意味着将访问控制的关键属性值与区块链节点进行捆绑,其目的是为了保证访问控制的关键属性值是区块链节点自身所设置,其他区块链节点也不可对访问控制的关键属性值“作假”。
访问控制策略由医院节点共同制定。访问控制策略由主体发起的请求交易触发。首先验证环境属性值交易参与方对应关系是否正确等,主体签名属性值是否真实;其次验证权限属性值是否真实以及主体具体操作属性值是否存在于权限属性值中;最后验证解密后的主体等级属性是否大于等于客体病历敏感性等级属性。访问控制策略执行完毕返回为真,就将交易作为凭证存入本地区块链。之后主体可根据上链后的交易凭证访问客体,客体拥有者实体通过作为凭证的交易是否为本地区块链交易的子集来判断主体是否拥有权限。通过此控制方式达到了根据患者敏感性需求细粒度控制电子病历操作权限的目的。
根据第2章节基于患者敏感性需求的细粒度控制方式的设计,该文在以上前提下设计了与控制方式相适应的基于区块链的电子病历可信管理方法。
电子病历可信管理是提供不同主体对电子病历的可信增加、可信修改和可信查询的服务。具体的应用场景如下:第一种类型的操作可信增加的应用场景,医生有新增电子病历的请求,通过区块链来以去中心化的方式发布可信增加操作请求;第二种类型的操作可信修改的应用场景,医生有修改患者相关电子病历请求,通过区块链来以去中心化的方式发布可信修改操作请求;第三种类型的操作可信查询的应用场景,医生或患者代理有查看患者相关电子病历请求,通过区块链来以去中心化的方式发布可信查询操作请求。上述请求成功发布之后需要在无第三方监管的情况下完成电子病历的可信使用。
基于区块链的电子病历可信管理方法设计,首先,需要明确在去中心化的场景中如何将对电子病历的操作请求表示为区块链上的“信任操作”,以此作为访问电子病历请求过程的真实性和合法性验证依据。其次,需要明确在去中心化的场景中如何将表示操作请求的“信任操作”上链,以此保证在电子病历存储方医院节点进行权限验证的过程中,有可信的验证依据。
表示对电子病历操作请求的“信任操作”定义可以参照比特币中“电子货币”交易行为的定义,同时需要注意操作请求需要与区块链节点身份进行捆绑,其目的是区块链节点不可否认是由自身发起的对电子病历的操作请求的行为,其他区块链节点也不可以冒充“行为发起人”的身份。
参照比特币系统中未花费交易输出(Uspent Transaction Output,UTXO)模型的设计,“电子货币”的基本定义是一条环环相扣的数字签名链。当“电子货币”的所有者想要将“电子货币”转移给他人时,操作过程是在数字签名链的末端连接一个新的数字签名,签名的具体内容包括获取“电子货币”最后一笔交易的哈希值和转移目标账户的公钥。在价值转移过程中,所有账户都可以通过在上一笔交易中对账户的钱包地址进行数字签名来证明其对“电子货币”的所有权,其他人可以验证该数字签名和公钥的匹配性。
通过对比特币系统中的UTXO 模型的分析,接下来对表示对电子病历操作请求的“信任操作”的数据结构进行设计。在去中心化的电子病历可信管理场景中,不同区块链用户根据自身所需发起对电子病历的操作请求,将电子病历加密地址作为输入,其是在新增电子病历时由医院提供并用对称密钥加密,表明是针对具体的电子病历的操作请求。同时,用户为了满足患者基于自身敏感性需求细粒度控制电子病历操作权限的需求,需要将第2 章节中基于患者敏感性需求的细粒度控制方式中各个实体的属性值作为输出,比如医院节点、医生节点、患者节点和患者代理节点等虚拟ID,患者代理节点即为与患者有关的各种利益相关者,如患者的家属。还有主体等级、病历敏感性等级、主体对客体所请求的具体操作和权限属性加密值。最后对上述输入输出进行Hash,然后由发起对电子病历操作请求的区块链节点私钥进行数字签名,得到操作请求的唯一数字签名标识。此过程也就意味着完成了将区块链节点操作请求行为和区块链节点身份的捆绑。
表示操作请求的“信任操作”上链需要完成三方面工作。首先是组装“信任操作”的区块结构和链结构的设计,其次是选定合适共识机制保证多方节点链上“信任操作”的一致性,最后是“信任操作”的验证。
(1)章节完成了对表示操作请求的“信任操作”的数据结构设计,接下来对块结构进行设计。参照比特币中区块结构的设计,将区块划分为区块头和区块体。每个区块头包含3 组元数据:第一组元数据是前一个区块的哈希值,用以连接父块;第二组元数据是随机数、时间戳以及与记账权竞争相关的难度值;第三组元数据是Merkle树的根节点。区块体存储经过验证的交易数据,是以Merkle 树结构存储交易的具体内容。为了验证区块中某笔交易的存在需要经过大量的哈希计算。由于该文在访问权限验证时需要确认区块中是否存在交易凭证。因此,为了避免在访问权限验证时进行大量的哈希计算,在每个区块中只存放一笔交易也就是3.1章节设计的“信任操作”,同时将区块结构只分为一个部分区块头。从下文可知共识机制采用拜占庭容错的方式,所以区块头中元数据无难度值和随机数,具体的区块结构如图1所示。
图1 基于区块链的电子病历可信管理的区块结构
完成上述区块的设计,接下来对区块所组的链结构进行设计分析,同样参照比特币的链结构,比特币中的链结构是由前后区块的哈希值链接而成并且每个区块都被加盖时间戳,根据比特币链结构的特点,利用上述区块中的父哈希值将区块链接成为链,如图2所示。
图2 链结构
3.2.2 共识机制的选择
随着交易量的不断增多链的长度也会不断地延伸,那么如何解决多方节点链上“信任操作”数据的一致性?比特币是通过多方共识机制来解决的。目前已经提出并可以落地使用的共识机制如下:比特币使用的工作量证明(Proof of Work,PoW)的共识机制,此工作量证明的共识机制随着链的不断增加较大的消耗CPU 算力;权益证明(Proof of Stake,PoS)机制;授权股份证明机制(Delegated Proof of Stake,DPoS);拜占庭容错(Practical Byzantine Fault Tolerance,PBFT)机制。考虑到该文中所提出的基于区块链的电子病历可信管理中所构造的区块链是私链,并且大量的节点身份是患者或患者代理,其具有的CPU算力不强大,要考虑以较小的代价维持区块链系统的运行,所以该文选用拜占庭容错的共识机制来解决多方节点链上数据的一致性。
3.2.3 “信任操作”的验证
根据上文可知,每个区块中只有一个“信任操作”行为,所以对其进行真实性和合法性的验证工作可以直接放在对区块的真实性验证过程中进行。第一种“信任操作”是由医生节点创建的对患者电子病历操作请求的交易;第二种“信任操作”是由患者代理节点创建的对患者电子病历操作请求的交易。以上两种“信任操作”组装成的区块上链和验证的流程不完全一样,接下里对其分别阐述、解析。
为了符号化描述以下区块真实性验证方法的步骤其所用的相关符号定义如表1所示。
不吃早餐:一日三餐,早餐最重要。老祖宗传下的养生规律告诉我们,早餐要吃而且要丰富,除了蛋白质、矿物质、微量元素还要有维生素。因为维生素可以促进肝组织修复,早餐不可过饱否则也会伤肝。
表1 验证符号定义
(1)医生节点发起操作请求,创建“信任操作”组成区块并验证的流程如下。
步骤1:某一区块链参与节点患者实体入院检查身体时,由医院实体将患者虚拟ID 为PID 还有自身虚拟ID 为HID 以及为患者分配的医生的虚拟ID 为DID联合成Msg广播。
步骤2:医生节点对电子病历发起操作请求,创建“信任操作”,将其组装成区块,广播该区块。
步骤3:其他参与方监听到广播的区块后,首先根据区块中的交易触发访问控制策略。执行访问控制策略内容,根据医生的DID 作为主键来在本地保存的集合Mp 中获取其公钥PkDID的值,根据公钥去解密交易签名看是否能解密成功。符号化如公式(1)所示。
步骤4:验证交易参与方之间的对应关系是否正确,即验证交易字段中的患者PID 以及医院HID 和医生DID 是否在本地Msgs 集合中也存在。符号化如公式(2)所示。
步骤5:验证权限属性,主要验证权限属性是否由患者私钥加密,根据交易中患者PID 作为主键来在本地保存的集合Mp 中获取其公钥PkPID的值,利用患者公钥PkPID解密权限属性加密值,解密成功则可以证明权限属性具有真实性,同时验证交易中的具体操作是否存在于权限属性值中。符号化如公式(3)所示。
步骤6:验证医生等级是否符合患者敏感性级别需求,即根据交易中医院HID 作为主键来在本地保存的集合Mp
以上步骤所描述的是医生节点执行可信操作并且创建“信任操作”组装成区块和验证区块真实性的所有流程,在验证都通过后,则认为区块中的“信任操作”可以作为可信的权限凭证,附上签名,将收到的区块和签名再次广播。根据实用拜占庭容错机制,若新区块通过至少2/3 参与方的验证,就保证多方节点链上“信任操作”的一致性。比如:医生节点的操作请求是查询或修改,则在区块上链之后,医生根据区块中的交易凭证查询或修改电子病历,存储电子病历的医院节点判断权限凭证是否为本地区块链交易的子集,通过则用医生节点公钥加密对称密钥并和电子病历加密地址联合广播,医生节点根据私钥获取对称密钥解密电子病历地址,并根据地址发起访问请求,医院节点操作数据库满足医生节点查询或修改电子病历的请求。如医生节点的操作需求是增加,则在区块上链之后,医生节点根据区块中的交易凭证增加电子病历,交易中的医院节点判断交易凭证是否为本地区块链交易的子集,通过则持久化存储电子病历满足医生节点新增电子病历的请求。
(2)患者代理节点发起操作请求,创建“信任操作”组成区块并验证的流程如下。
步骤1:当某一患者代理查看患者电子病历时,创建“信任操作”并组装成区块,广播该区块。
步骤2:其他参与方监听到广播的区块后,首先根据区块中的交易触发访问控制策略。执行访问控制策略内容,根据患者代理的PGID作为主键来在本地保存的集合Mp 中获取其公钥PkPGID的值,根据公钥去解密交易签名看是否能解密成功。符号化如公式(5)所示。
步骤3:验证权限属性,主要验证权限属性是否由患者私钥加密,利用患者公钥PkPID解密权限属性加密值,解密成功则可以证明权限属性具有真实性,同时验证交易中的具体操作是否存在于权限属性值中。符号化如公式(6)所示。
步骤4:验证患者代理等级是否符合患者敏感性级别需求,即利用患者代理公钥PkPGID和患者公钥PkPID以及患者代理等级和病历敏感性等级验证解密后的患者代理等级是否大于等于病历敏感性等级。符号化如公式(7)所示。最后,验证区块指向前区块的哈希值是否正确。
以上步骤所描述的是患者代理节点查看患者电子病历并且创建“信任操作”组装成区块和验证区块真实性的所有流程,在验证都通过后,则认为区块中的“信任操作”可以作为可信的权限凭证,附上签名,将收到的区块和签名再次广播。根据实用拜占庭容错机制,若新区块通过至少2/3参与方的验证,就将该区块加入链中。患者代理节点根据区块中的交易凭证查询电子病历,存储电子病历的医院节点判断权限凭证是否为本地区块链交易的子集,通过则用患者代理节点公钥加密对称密钥并和电子病历加密地址联合广播,患者代理节点根据私钥获取对称密钥解密电子病历地址,并根据地址发起访问请求,医院节点操作数据库满足患者代理节点查询电子病历的请求。
该节目的是根据第2 节和第3 节基于患者敏感性需求的细粒度控制方式和电子病历可信管理方法的设计在具体的区块链实验平台上进行仿真测试。
该文基于区块链的电子病历可信管理系统中,核心功能为病历管理,即给用户提供对电子病历的可信查询、可信增加和可信修改等服务,整体是以去中心化的方式进行的。主流的区块链开发平台有以太坊平台和超级账本。以太坊平台最突出的特色是智能合约,给以太坊平台增加了图灵完备的特性。该课题实验需要利用到智能合约来执行电子病历可信管理方法,因此选择以太网作为开发平台,实验环境是基于Ubuntu18.0.4 系统,使用Ganache 客户端快速生成一个拥有10个节点的本地私有区块链网络,以便于测试。
基于第3 节总体方法的设计可知,两种交易凭证可以在该文所提供的区块真实性验证方法下保证其可信,实验是根据第3章节的具体流程来操作。
在访问控制策略验证通过返回true后包含交易凭证的区块在本地首先上链,并且将区块签名广播到区块链网络,方法采用实用拜占庭容错的共识机制,当至少2/3 节点都验证通过后,区块就可完成真正的上链,只有上链后的区块所包含的交易凭证才会受到医院节点的信任,同样也才能成功获得访问授权并执行后续的访问操作。例如:医生节点操作患者电子病历时创建合法请求交易并组装成区块,区块通过验证并最终完成上链,医生节点才能获得访问授权,并执行后续的访问操作。
当用户节点等级小于电子病历敏感性等级时,对电子病历进行具体操作,创建请求交易组装成区块并广播,区块无法通过验证,最终无法完成上链,在系统交互界面会显示其无权操作病历如图3所示。结果证明方案解决了患者无法根据自身敏感性需求细粒度控制电子病历操作权限的技术问题。
图3 基于患者敏感性需求的细粒度控制效果图
以上仿真实验说明了该文基于区块链的电子病历可信管理方法的可行性与正确性。
该文针对目前去中心化电子病历管理方案中尚未解决的技术问题,设计了基于患者敏感性需求的细粒度控制方式和与控制方式相适应的基于区块链的电子病历可信管理方法,通过区块真实性验证方法的正确性证明和在以太坊平台上进行的仿真实验,最终验证了所提出的基于患者敏感性需求的细粒度控制方式和基于区块链的电子病历可信管理方法的可行性与正确性。下一步准备针对共识算法进行研究,设计更加适用于该方法的共识机制,从而完善该文所设计的去中心化电子病历可信管理方法。