◆秦嘉奇
(桂林信息科技学院 广西 541000)
信息化是各个行业发展的趋势。在信息化的进程中,多数的医院基本已经完成了办公信息化、网络化。在目前的医疗信息化结构下,医院有各自的电子病历数据库,该数据库处于医院内部网络中,不对外开放,形成信息孤岛[1]。当患者到其他医院就诊时,患者的历史就诊信息无法共享给其他医院,这就对历史就诊信息造成了浪费。同时,患者电子病历集中存储在一个数据库服务器中,一旦遭受攻击,极易造成大面积的信息泄露甚至是信息损坏,电子病历数据在这种模式下极易被窜改。
区块链的特征在于去中心化[2],数据以区块链的形式存储是一种分布式的存储方式,每个服务器结点都持有一个所有数据的副本,所有的服务器结点都按照一定的规则保持同步。使用区块链技术存储电子病历,利用其分布式、不可修改的特性,可以解决电子病历数据的共享问题,同时还保证了电子病历不被修改。
医疗信息管理系统一般基于C/S架构或B/S架构,在表现层一般使用桌面UI或者基于Web的用户界面,数据处理后端则一般使用Java、C#、PHP等编程语言对数据库进行操作。系统的总体架构如图1所示。
图1 传统的基于C/S架构或B/S架构的医疗信息存储
传统电子病历管理系统中,根据开发技术不同,表现层的实现方案也不同,但存储方案比较单一,都是将医疗信息数据存储到数据库中。在各个医院都各自建立医疗信息数据库的背景下,由于不需要连接到外网,安全威胁较小,因此所有医疗数据几乎都存储在一个物理服务器中。这样做在局部实现了信息化并且保证了一定的安全性,但是医疗信息无法与其他医院共享,如果贸然接入外网共享医疗信息,则要面临各个医院数据接口不一致以及来自外网的各种高风险因素。区块链的出现给医疗信息的存储与共享提供了新的思路。
电子病历包含了多项内容,需要存储的信息包括病人的ID、姓名、性别等自然信息,病人的入院、出院、转院、转科等流转情况,病人就诊期间的各项检查记录、治疗记录,病人的护理记录等等[3]。每个医院根据自身情况,对电子病历应当包含的信息大致相同,但一些数据项的细节可能稍有不一样,这样一来数据接口就难以统一。为了统一数据接口,可以考虑将电子病历中所有的数据项都以JSON的形式进行序列化,将JSON串视为一整个数据大项。在需要获取数据时,通过反序列化再次得到结构化的数据即可,然后根据特定系统提供的数据格式结构解析JSON得到最终数据。因此,电子病历的具体存储内容在文中的架构上不做固定要求,要获取数据时只需要提供JSON格式的数据接口即可,这样就保证了每个医院的电子病历信息兼容。
整套存储方案通过HTTP协议提供访问接口与其他子系统进行交互,即存储系统以HTTP服务器的方式提供服务,数据通过HTTP请求和响应的方式进行传输。Web服务器从用户界面获取到病历信息,然后将病历信息序列化成JSON格式的字符串,序列化以后的整个信息首先以患者ID为标识存入医院的本地数据库中。本地数据库中的电子病历字符串按照一定的周期(每3天、一周)由区块链结点服务器查询数据库得到部分未同步过的本地病历数据,经过由本地服务器持有的对称密钥加密后同步到区块链中。图2为该过程示意图。
图2 电子病历在区块链中的存储策略
如果有需要将电子病历进行共享,那么操作过程与电子病历的存储过程有些类似,只不过需要使用非对称加密电子病历数据,该过程描述如下。
医院存有本地的电子病历数据库,可以通过患者ID和区块哈希值查询到对应的电子病历,然后将该病历的JSON串通过数据请求方给定的公钥加密并同步到区块链当中。上述过程完成后,将带有加密病历数据的区块对应的哈希值发送给数据请求方,数据请求方根据哈希值在区块链中找到对应的区块并将其取回,然后使用自己的私钥解密得到最终病历数据。在病例数据共享过程中,所有的未加密信息仅有患者ID和区块哈希值,具体的电子病历信息并没有公开。由于患者在多个医院都可以有电子病历,若每个医院把所有患者的全部病历都保存在本地,则对医院本地数据存储及更新是一个负担,而采用区块链中的共识算法,每个医院只要保存患者的前次病历哈希值以及本次医疗信息即可(即最保存了最新病历信息的一个区块),避免了把患者的所有病历都保存在本地而导致的存储膨胀问题。由于把前次病历的哈希值保存在本地数据库,同时又防止了其他单位篡改患者病历的可能性。
利用区块链技术存储电子病历还能够给病历数据提供较高的安全保障,当本地数据库因为攻击或其他不可抗力受到损害时,可以利用区块链的特性进行数据回溯,对丢失的数据进行找回,图3展示了电子病历数据回溯的模型。
图3 电子病历数据回溯模型
由于使用了区块链技术,因此排除区块链中数据被篡改的可能性,即区块链中的数据完全可靠。当本地数据库数据丢失时,可以从网络中任一区块链服务器中找到完整的历史数据。注意到本地同步到区块链上的区块中存有经过本地对称密钥加密过的电子病历信息,因此只需要沿着最后一个区块将区块链中最后一些区块各个取回,然后使用本地密钥解密即可还原出本地的历史电子病历。由于每个区块保存的电子病历都是由其同步的区块链节点的本地密钥进行加密,因此不必担心未授权的电子病历被其他节点看见。
为了验证上述方案的可行性,使用Flask[4]对上述方案进行仿真实验。仿真实验运行在Windows平台,基于python语言,实验计算机具有16G内存和至强Sliver 4110 CPU。
增加了若干电子病历的区块链如图4所示。
图4 电子病历在区块链中以JSON形式表示
可以通过previous_hash找到某一个区块的前一个区块,也可以通过hash来查找对应区块。当以URL:http://202.193.53.212:5000/block?hash=3f75f998c8f9e8258cb1c2acdd251ab489ea113c734963 4e38bc5ddfc5fb138c查询区块链时,结果如图5所示。
图5 使用hash值查询电子病历信息
假设某医院的数据库损坏,需要进行数据回溯,则可以通过新建一个区块链节点注册到区块链任一节点实现数据同步,然后可以将数据解密后写回数据库,从而实现数据回溯。仿真实验中新建了一个节点并注册到区块链,验证共识算法的有效性(较短的区块链会被较长的区块链替代)。测试结果如图6所示。
图6 空区块链节点同步电子病历信息
区块链技术实际上提供了一个良好的分布式数据库解决方案,其共识机制保证了所有节点数据一致,其数据结构又提供了修改区块链要付出巨大代价这一特性,也就保证了数据不会被修改。利用区块链的特性,文中提出了基于区块链的电子病历存储方案,并给出了核心算法的实施方案。但是区块链距离真正推广运用还有很多问题需要解决,例如庞大区块链的存储问题,由此带来的查找性能问题以及单个大数据的存储问题等。