余 健,胡孔法,丁有伟
(南京中医药大学 人工智能与信息技术学院,江苏 南京 210023)
医疗数据作为特殊的高价值基础数据之一,必然会打破传统的数据孤岛走向共享。但是,医疗数据共享带来巨大价值和便利的同时,也使得医疗数据泄漏现象和勒索病毒事件频繁发生,使与民生息息相关的医疗数据安全面临着前所未有的挑战[1-4]。在国内外,为了保证医疗数据中的用户隐私,研究人员采用了多种方法。一种常用的方法是以加密形式存储数据,此方法的主要缺陷是它严重限制了用户以细粒度级别选择性地共享其加密数据的能力。当用户查询信息时,每次执行的解密计算费时,影响了系统查询效率。另一种常见处理方法是访问控制,尤其在医疗数据共享中,出现了大量的访问控制方案。尤其是近年来随着云服务的兴起、区块链技术的产生,医疗云成为一种新的信息共享和数据存储方式。但是,医疗系统的安全保障能力和措施是实现“可信医疗云”的关键[5,6]。目前,大多数的医疗数据借助于云计算技术来实现资源共享,但是面对存有隐患的云存储环境,寻找一种高安全的隐私保护方案成为当前所需。在云存储的背景下,以医疗数据中的用户隐私信息保护为目标,提出一种基于属性加密和结构授权的隐私保护方案。
传统的医疗数据大多采用结构化的关系型数据库来存储信息,有专门的数据库管理系统来管理。但是随着网络的普及,医疗数据不仅需要有效地存储及管理,还需要经过网络传输,在不同系统之间传递数据,实现信息共享。为了实现医疗数据的良好互通,医疗文档目前是建立在一个统一的语法和语义集上,语法大多是遵从数据交换或消息传输标准HL7(health level seven,HL7),语义大多是使用临床文档结构标准CDA(clinical document architecture,CDA)。CDA是HL7组织发布的第一个基于XML的医疗行业标准,所以XML(eXtensible markup language,XML)形式存储和描述的医疗数据几乎成为目前的标准格式[7,8]。
这里,为了说明和描述方便,用XML表示的医疗文档示例如图1所示。每个XML文档都对应一棵倒置的树,每个标签节点称为结构节点,其中
图1 XML形式表示的电子病历示例
文档结构反应的是信息的框架,即从这个文档结构,可以获知这是一个医疗病历记录文档,而具体的病患及治疗信息存储于各个叶节点内容中,所以叶节点内容是核心信息,是人们想获取的主要内容。从图1的XML文档特征来看,以
因此,面对如此结构特征的医疗数据,若将医疗数据托管于云端,虽然有利于多部门的数据共享,方便用户访问,但是这种托管模式,使得存储于云端的数据容易遭到外界攻击,无形中增加了数据隐私泄露的风险。为了确保共享数据的同时,保护好敏感信息,需要解决以下3个核心问题:
(1)核心问题1:如何在不受信任的基础设施中保证敏感数据的机密性?
(2)核心问题2:如何在面对不可靠的云服务商时,防止数据被篡改,保护数据完整性?
(3)核心问题3:如何在面对不同合法用户时,给予不同的访问权限,以区别不同用户对信息的使用度?如何让不同授权用户获取细粒度访问信息?
(1)基于属性加密的认证机制
基于属性的加密体制中,由数据所有者制定访问控制策略,只有满足访问规则的用户才能解密加密的资源,这种方法不仅有效控制了数据使用范围,而且增强了系统灵活性和可操作性,可以解决核心问题1。
在属性加密中,把身份标识看作是一系列属性,当用户拥有的属性解密密钥超过加密者所描述的预设门槛时,用户可解密。属性加密的基础是秘密共享,只不过在属性加密中,秘密共享中的t个用户变成了t个属性。基于属性加密的访问控制技术通过属性集和访问控制策略将用户和数据关联在一起,能够实现细粒度访问控制。在本方案中,采用的是基于密文策略的属性加密,同时基于线性秘密分享算法来分发属性密钥。这里属性加密的理论基础是双线性映射[9],属性密钥的分发采用的是线性秘密共享矩阵[10]。
1)双线性映射
2)线性秘密共享
假设:对一个l行n列的共享矩阵M和一个从 {1,2,…,l} 到P的映射ρ, 选择随机值构成向量v=(s,y2,…,yn)∈Zp, 其中s是共享的秘密,利用线性秘密共享方案可以得到关于s的l个共享值组成的向量Mv, 其中 (Mv)i属于实体ρ(i), 记为λi。
(2)引入哈希函数,保证核心内容的完整性
根据医疗数据的结构特征,可以首先压缩文档结构,对摘取的叶节点内容信息(即核心信息)进行编码,然后采用结构和叶节点内容分离的存储模式,将叶节点内容信息存储于云端,将结构信息存储于可信的轻量级雾节点中。由于考虑到叶节点信息的重要性,这里选用SHA(secure hash algorithm)算法来确保云端医疗数据的完整性,即解决核心问题2。这里,SHA-256算法是一种安全摘要算法,能灵活感知明文的变化,这种哈希函数具有单一性、快速性及无碰撞性特征,对于输入任意长度的明文,其输出为256位的报文摘要[11]。
(3)访问授权矩阵的建立
对于满足属性访问策略的用户,使用其属性密钥组件能够解密密文信息,获得叶节点内容。但是XML是结构和内容的结合体,细粒度的访问控制应该实现对不同的合法用户,展示不同的访问视图。这里采用不同的访问授权矩阵来表示不同用户的访问授权,让不同的合法身份用户看到不同的XML访问视图,解决核心问题3,这里引入雾节点来存储XML授权矩阵[12],基于属性加密和结构矩阵存储相结合方式来共同完成不同群体用户的访问授权问题。
属性加密体制作为基于身份的密码体系的一个扩展,因其有机结合了密码学与访问控制的特点,成为身份认证的重要方法。本文将这种属性加密体制应用于云计算的大背景之下,设计出了针对医疗数据的隐私保护方案。
为了实现对医疗数据的安全共享,既能为不同需求的用户提供数据共享,又能保护数据中的敏感信息,防止信息泄露事件的发生。这里采用XML结构和内容分离存储保护模式,引入了属性加密来控制合法用户的访问,同时雾节点作为可信节点,分担了一些存储和计算,具体结构及功能如图2所示。
图2 结构、功能及流程
底层结构主要由4部分组成:数据和授权中心、雾节点、云服务器和用户。其中数据和授权中心既是医疗数据的拥有者,也是授权管理者,主要负责管理系统中所有的属性、属性分配及密钥生成和分发。雾节点作为云端、用户及授权中心的桥梁,主要任务是根据用户提供的属性密钥组件解密从云端传来的加密的叶节点内容,同时结合其存储的授权结构矩阵生成用户需要的XML数据,此外,它也负责对到云端的数据做完整性检验。
3.2.1 数据和授权中心
数据和授权中心DAC(data authority center,DAC)作为核心节点,可以由医院的数据服务器充当,它既是医疗数据的拥有者,又是权威中心,负责整个系统的授权、密钥分发、共享文档的结构和内容分离等功能。其形式化定义如下:
(2)将XML表示的医疗数据进行结构和内容分离Divide(XML)→(Content,Struc)。
(3)根据用户属性及系统内置的访问策略生成访问策略矩阵MAC: Genernate(A,P1,P2,…Pi…Pn)→MAC。
(4)根据MAC确定用户所属群体,创建XML结构授权矩阵Mstruc: Create(Struc,MAC)→Mstruc。
(5)给拥有不同属性组件的用户ASi分发解密密钥SKi: KeyGen(PK,MSK,ASi)→SKi, 其中SKi包括(DSKi,SFKi),DSKi用于解密存储于云端的XML叶节点内容,SFKi用于获取雾中的XML结构授权矩阵Mstruc(i)。
(7)把用户属性访问授权矩阵、分离出的XML结构授权矩阵Mstruc和哈希值H送给雾节点存储: Send(MAC,Mstruc,H)→Fog。
3.2.2 雾节点Fog
(1)实时接收用户查询请求,根据属性访问策略计算该用户是否满足解密条件,对拥有属性解密组件,满足条件用户,则给云端发送请求命令获取密文, Send(Req)→Cloud; Obtain(C)←Cloud;
(2)先对密文C做完整性检验: SHA256(C)=H?
(3)如果未发现篡改则解密密文: Decryption(DSKi,C)→Content; 同时根据SFKi确定用户Mstruc(i): Decryption(SFKi)→Mstruc(i)。
(4)根据用户获取的XML结构授权矩阵Mstruc(i)和解密后得到的叶节点内容,组合出可用的XML数据信息: Combine(Content,Mstruc(i))→XML data, 发送给发出查询请求的用户: Send(XML data)→Useri。
3.2.3 云端Cloud
(1)负责接收DAC发送的密文信息并存储:Save(C);
(2)实时监听,准备接收来自雾节点的请求信息:Listening(Fog);
(3)接收雾节点的请求,并发送密文给Fog: Send(C)→Fog。
3.2.4 用户端Useri
(1)发送请求到DAC: Send(ASi)→DAC, 符合访问策略的用户能获得解密密钥;
(2)发送解密密钥和查询请求到Fog: Send(Request,SKi,)→Fog, 查询具体信息;
(3)接收由Fog给出的查询结果。
3.3.1 节点编码及信息的查询
为了方便查找和快速获取XML文档中的叶节点内容信息,这里采用深度优先遍历整个共享文档,使用起止区间编码,使每个叶子节点内容具有唯一的编码值。为了压缩主干结构的同时不影响信息查询,这里需要在编码前对共享文档进行一致化预处理。例如,针对图1,给每个用户预留50条
表1 节点起止区间编码
在起止区间编码中,叶节点编码左值等于其编码右值,所以采用这个相同的值作为叶节点内容编码。针对图1的叶子节点内容编码见表2。
表2 叶节点内容编码
表1尽管只记录了主干结构树中节点编码信息,但是由于重复节点具有相同的子树同构,所以可以通过式(1)计算出其它重复节点的编码信息。例如Record为重复节点,已知第一个重复节点Record[0]的节点编码为(p,q),那么第i个Record节点的编码为(m,n),具体见式(1)
(1)
另外起止区间编码有利于信息的查询,例如查找Record[0]中的子树信息,只需知道Record[0]的编码(p,q),它的所有子节点信息都在这个p到q的区间范围内。
3.3.2 主干结构树的矩阵表示
主干结构树的提取方法去除了XML文档的结构冗余。例如:以图1中节点patient作为根,这是一名患者医疗数据,里面存储有50条看病记录。节点Record是带有重复结构信息子树的根节点。获得的主干结构树具体如图3所示。
图3 主干结构树
为方便信息处理,这里将主干结构树转化为矩阵形式存储。这里特别说明,对于规范且有意义的XML文档而言,一般很少有单支树的情形出现,对于非规范的XML文档,在实际应用中需要预处理,转换成规范的XML文档,所以只考虑规范的XML文档转化方法。
矩阵转化规则如下[13]:
(1)矩阵维数是由主干结构树中叶子节点的个数决定的;
(2)叶节点按其出现在主干树中的顺序k,依次存储于矩阵的主对角线上,按照叶节点在主干结构树中从上到下、从左到右出现的顺序依次存储。
(3)中间节点在矩阵中的存储位置是由其所有的儿子节点存储位置决定。将其所有儿子节点存储位置中的最大横坐标值作为其横坐标值,儿子节点存储位置中的最小纵坐标值作为其纵坐标值。具体见式(2)。
假设节点a在矩阵中的存储位置定义为[p,q],p是其横坐标值,q是其纵坐标值, (p,q=1,2,…m)。 那么p和q的计算公式为式(2)。其中k为叶节点在主干树中出现的顺序值 (k=0,1,2…)。 若a为中间节点,假设其所有儿子存储信息为 [p1,q1], [p2,q2]……
(2)
图3对应的转化矩阵具体如图4所示。在此矩阵中,所有主干节点存放于下三角阵中,右上角阵中存储对应节点的编码信息。例如节点patient存储于[8,0],那么它的编码信息对称地存于[0,8]中。
图4 主干对应的矩阵存储
3.3.3 不同群体的结构授权矩阵
依据用户提供的属性组件,结合DAC中定好的访问策略,在系统中为不同用户或群体生成不同授权的XML授权结构树。例如,病理学专家想研究近年来不同年龄段患者的病理和用药情况,经系统过滤后,其授权结构如图5所示。
图5 不同授权的结构树
对应于图5的授权结构树,其授权矩阵存储如图6所示,这里为保护隐私去掉了其不可访问的节点,只保留授权节点及其编码信息。
图6 对应的授权矩阵
用户向DAC提供其属性集,获取相关联的属性密钥组件。SKi包括DSKi和SFKi,DSKi用于解密存储于云端的XML节点内容,而SFKi用于获取雾中的XML授权结构矩阵。
将针对用户属性的访问授权矩阵MAC、分离出的XML结构授权矩阵Mstruc和哈希值H送给雾节点存储: Send(MAC,Mstruc,H)→Fog。 MAC是针对用户属性的访问授权矩阵;Mstruc是为不同用户创建的XML结构授权矩阵,面向的是XML文档结构的访问权限。
用户发送查询请求Req及授权密钥SKi给雾节点。SKi是用户i的合法授权访问密钥组件,通过此密钥中的DSKi可以解密存储于云端的XML节点内容,通过SFKi可以获取雾中的XML授权结构矩阵,拥有了XML结构和内容的信息才能拼凑出有用信息。所以此密钥中的任何一个不能成功解密,用户都得不到完整的查询信息。
雾节点发送密文获取请求,通过用户的属性秘钥组件解密云端信息。云端发送密文给雾节点,雾节点先用SHA256做完整性检验,然后再使用用户密钥解密密文,获取内容信息。
雾节点为用户i组合其XML授权结构矩阵和叶节点内容,把查询的信息即XML data发送给用户。
为了证明此方案的安全性能,主要从两方面进行证明:①从认证模式方面来证明其安全性;②从信息获取方式上来证明其安全性。
从认证模式方面来看,在属性加密机制中,这种基于用户集合,借助于双线性映射和密码学知识,结合线性秘密共享机制完成的基于属性集的认证。
4.2.1 认证模式方面
(1)密钥生成
随机选择α,β∈Zp, 产生系统公共参数PK和系统主密钥MSK,使得:
1)MSK=β,gα, MSK为用户生成私钥时使用。
3)随机选择γ∈Zp, 随机值γ根据用户属性集分发,对用户的每个属性,都分配一对值Dj和Dj′。
设用户属性集为S,对任意j∈S, 随机选择γj∈Zp, 分发密钥:
(2)加密
随机选择ω∈Zp, 构造访问树T,T的叶节点集合Y,任意y∈Y, att(y) 表示属性字符串, H(att(y)) 将属性字符串散列成G0中的元素。生成密文CT
(3)解密
已知密文CT和私钥SK:
∀y∈Y, 记j=att(y)。 若j∈S, 计算式(3)DecryptCode(CT,SK,y), 若j∉S, 则计算终止
(3)
依次类推,可求得访问策略树根节点值,为秘钥s,把解密出的秘密值s带入如式(4),即可获取明文M,即叶节点内容
(4)
根据访问策略的授权模式来访问密文的安全性证明如文献[14,15],这里具体证明不再累述。
4.2.2 信息获取方面
下面主要是针对信息获取方面的安全性证明。
假设(1):挑战者获取了用户i的密钥SFKi,那么通过雾节点,他能获得该用户的XML结构授权矩阵,通过结构授权矩阵,能掌握XML文档框架,知道这是一个存储医疗数据的文档结构,但是缺少叶节点内容的结构是无意义的,所以挑战者获取信息失败。
假设(2):挑战者获取了雾节点中所有结构授权矩阵,理由同上,缺少内容的结构是无意义的信息。
假设(3):挑战者获取了雾节点中部分结构授权矩阵和云端的全部信息(即全部叶节点内容),并成功解密信息,那么结构授权矩阵和叶节点内容的组合是根据编码规则,遵从一定的组合规则才能拼凑成功,如果不知道具体规则,组合出有意义信息的概率很低。
证明如下:假设在XML文档中含有q个核心单元(类似于patient)。相应地,在每个核心单元中有r个子节点(类似于patient树中的每个子节点),设在r个节点中有s个节点是敏感节点,这里s≤r,那么对于q个核心单元而言,它的内容项有r*q个。挑战者掌握了结构矩阵,同时他随机从r*q个内容中获取n个,总体n个条目中有m组核心单元,那么获取一个敏感信息的概率p为
(5)
本文提出了一种基于属性加密和XML结构授权相结合的医疗数据隐私保护方案,该方案采用结构和内容分离式存储的思想,基于属性加密体制,采用提取主干结构树法去除结构冗余,使用区间编码便于叶节点内容的查询。进一步地,在云端和雾节点的相互配合下,实现了基于用户属性加密的访问授权,通过授权矩阵存储形式完成了共享文档的结构授权。系统设计和安全性证明进一步说明:该方案可以确保医疗数据的完整性、机密性,实现了保护数据隐私下的数据共享。