韩刚,王嘉乾,罗维,等. 公共卫生事件中医疗数据访问控制与安全共享研究[J]. 信息安全学报,2023,8(1):40-54. DOI:10.19363/J.cnki.cn10-1380/tn.2023.01.04.

1.问题

  • 传统医疗系统中,数据信息由不可信第三方进行保管,不可信第三方可能对数据进行任意地伪造、篡改和泄露。
  • 信息系统没有细粒度的访问控制、权限没有精细划分。
  • 医疗信息系统访问过程不透明、不可溯源,若发生信息被攻击的情况,无法有效追责。

2.贡献

  • 在基于属性访问控制的基础上,引入属性访问通行证,使主体在限定时间内进行访问时,无需再次对属性和访问控制策略进行匹配,保证访问控制完整性严密性的前提下减小开销。
  • 将访问控制与区块链结合,解决数据不可篡改、访问公开透明、访问过程不可溯源的问题。
  • 由于医疗系统的区块链为联盟链,不使用传统的POX系列共识算法,使用实用拜占庭容错算法,以实现通过较少节点便可以达成共识的目的。

3.基础知识

3.1 实用拜占庭容错算法

拜占庭将军问题提出后,有很多的算法被提出用于解决这个问题。这类算法统称为拜占庭容错算法(BTF:Byzantine Fault Tolerance)。它不是一个具体的算法,而是能够抵抗拜占庭将军问题导致的一系列故障的系统属性。这意味着即使某些节点出现缺点或恶意行为,拜占庭容错系统也能继续运转。

本质来说,拜占庭容错方案就是少数服从多数。

实用拜占庭容错算法(PBFT)实现了在有限个节点的情况下的拜占庭问题,有3f+1的容错性(拜占庭将军问题也只有在节点数N>3f时可解),并保证一定的性能。其采用了密码学相关技术(RSA签名、MAC、Hash)确保消息传递过程无法被篡改和破坏。

3.1.1 3f+1?

3f+1指的是总节点数至少为4。先来看看节点数为3,其中有一个叛徒的情况。

B(接收者)是叛徒:

image-20231113105714909

A(发令者)是叛徒:

image-20231113110359062

最后的结果中,总有节点为(0,1),即投票1:1,造成不能决断。

现在来看看4个节点,其中有一个是叛徒的情况。

C(接收者)是叛徒:

image-20231113110730946

A(发令者)是叛徒:

image-20231113110905412

最后,少数服从多数,都会达成一致。

证明:

  • 假设有n个节点,其中有f个叛徒,那么忠臣就有n-f个
  • 必须在n-f个状态复制机(接受的消息)的沟通内,就要做出决定(因为要考虑到叛徒不会发消息的情况)
  • 但是收到的n-f个消息也不一定都是真的,有可能在做出决定时收到的都是叛徒的消息(叛徒比较勤快),那么n-f个消息中就有f个假的
  • 那么就有n-f-f个真消息,需要保证n-f-f>f即n>3f

综上,当恶意节点为f时,只要总节点数≥3f+1,便可以达成共识的达成。

3.1.2 算法流程

image-20231113115015113

开始阶段

  • PBFT算法中节点有两种角色:主节点(primary)和副本(replica),即上述发令者和接收者,两种角色可以互换
  • 两者的转换引入了视图(view)的概念,起到逻辑时钟的作用
  • 确定主节点:p = v mod n计算

请求

  • 客户端(c)发送request消息给主节点p(图中的0)
  • 消息结构:<REQUEST,o,t,c>
    • o:请求的具体操作
    • t:追加的时间戳
    • c:客户端标识

预准备

  • 主节点收到客户端发送来的消息后,构造pre-prepare消息结构体,广播到集群的其他节点(图中1、2、3)
  • 消息结构:<<PRE-PREPARE,v,n,d>,m>
    • v:当前视图编号
    • n:主节点广播消息的唯一递增序号
    • dm的消息摘要
    • m:客户端发来的消息

准备

  • 副本收到主节点请求后,会对消息进行检查,检查通过后会将消息存储在本节点,并且变更自身状态到PREPARE状态。状态变更完成后,节点广播消息。
  • 消息结构:<<PREPARE,v,n,d,i>>
    • i:本节点的编号
  • 对消息的有效性检查如下:
    • 检查消息体中的摘要d,是否和自己对m生成的摘要一致,确保消息的完整
    • 检查v是否和当前v一致
    • 检查序号n是否在水线hH之间,避免快速消耗可用序号
    • 检查之前是否接受过相同序号nv,但是不同摘要d的消息

提交

  • 副本收到2f+1(包括自己)个一致的PREPARE消息后,会进入COMMIT阶段,并且广播消息给集群中的其他节点
  • 在收到PREPARE消息后,副本同样也会对消息进行有效性检查,检查内容同准备阶段
  • 消息结构:<COMMIT,v,n,D(m),i>

回复

副本收到2f+1(包括自己的)个一致的COMMIT个消息后执行m中包含的操作,其中,如果有多个m则按照序号n从小到大执行,执行完之后发送执行成功的消息给客户端。

4.系统流程

4.1 通行证申请

image-20231114092504823
  1. 属性发布方AP将所需所有属性上传至令牌属性管理中心TAMC,TAMC整合所有属性发送到日志部署点LDP,LDP将属性上传至日志链LC,保证所有属性透明公开。
  2. 当主体S申请属性通行证时,S将自己的个人信息上传至TAMC,TAMC对主体信息进行匹配,生成相应的属性通行证token
  3. S将个人信息上传至密钥分发中心KDC,KDC生成对应的公私钥,将私钥给S,公钥给TAMC
  4. TAMC生成token后,利用S的公钥对token进行加密并发送给S,同时,TAMC将整个申请过程以及生成通行证的token_id生成日志,并将日志发送到部署点LDP中

4.2 客体上传

image-20231114095909959
  1. 数据拥有者DO首先将所拥有的客体O上传至数据库服务器DB中,DB接收到客体O之后,对O进行hsah,生成客体摘要OH(Object Hash),然后将OH与客体存储地址A发送给数据拥有者DO,DO拿到OH和A后,将数据D上传至数据部署点DDP,DDP将D上传至客体链OC中。
  2. DO将访问控制策略ACS上传到策略管理点PAP,PAP对策略进行整合并将其发送到策略部署点PLA,策略部署点PLP将ACS部署到OC上

4.3 访问授权

image-20231114101408722
  1. S将通行证上传至策略执行点PEP,PEP对token进行验证,并记录下token_id
  2. PEP将token发送给策略决策点PDP,PDP首先判断token_type,然后将token_type上传至策略管理点PAP,PAP根据具体的属性信息匹配ACS,将匹配到的访问控制策略ACS发送给PDP
  3. PDP将属性信息与对应的访问控制策略ACS发送到访问授权点AAP,AAP根据接收到的属性和访问策略ACS生成的访问凭据access,并将访问凭据access上传至策略执行点PEP。PEP将访问凭据access发送给S和日志部署点LDP。最后由LDP将访问授权日志AAL和访问凭证access部署到日志链LC上。

4.4 访问

image-20231114110258987
  1. S将access上传到数据服务器DB中,DB对访问凭据access进行验证并判断验证结果,成功则返还对应客体O,反之则拒绝访问请求。
  2. 数据库服务器DB将访问凭据标识符access_id进行记录,并上传日志部署点LDP,LDP继续上链。

5.智能合约实现

5.1 日志部署点LDP

智能合约的方式在通行证申请阶段、访问授权阶段以及访问阶段发挥作用。

  1. 通行证申请阶段
begin
if TAMC.send( Attribute_all, process) == true //当TAMC将属性Attribute_all和主体申请过程process上传至LDP条件达成时
{
LDP.get( Attribute_all , process)//LDP获取
u = LDP.arrange( Attribute_all , process)//LDP整合
LDP.upload(u)//上传
}
end
  1. 访问授权阶段
begin
if PEP.send(access) == true//当PEP将访问凭据access上传到LDP时条件达成
{
LDP.get(access)//LDP获取
a = LDP.arrange(access)//LDP整合
LDP.upload(a)//上传
}
end
  1. 访问阶段
begin
if DB.send(access_id) == true//数据库DB将访问凭证的唯一标识符access_id上传到LDP时条件达成
{
LDP.get(access_id)//LDP获取
LDP.upload(access_id)//上传
}
end

5.2 数据部署点DDP

DDP以智能合约的方式在客体上传阶段发挥作用。

begin
if DB.send(OH,A)==true//当数据库服务器 DB 向数据部署点 DDP发送客体摘要值OH和客体地址A时,条件达成
{
DDP.get(OH,A)
DDP.upload(OH,A)
}
end

5.3 策略部署点PLP

策略部署点PLP以智能合约的方式在客体上传阶段发挥作用。

begin
if PAP.send(ACS) == true//当策略管理点PAP向策略部署点 PLP发送访问控制策略ACS条件达成
{
PLP.get(ACS)//获取数据
PLP.upload(ACS)//上传
}
end

5.4 策略执行点PEP

策略执行点PEP以智能合约的方式在访问授权阶段发挥作用,分别在主体S发送上传通行证以及访问授权点AAP将访问凭据access发送给策略执行点PEP的条件达成时,PEP接收访问凭据access并实现对应功能,具体过程如下:

  1. S发送token时
begin
if S.send(token) ==true//S发送token时条件达成
{
PEP.get(S_token)
if PEP.verify(S_token) == true//验证
{
PEP.record(token_id)//记录token_id
PEP.send(S_token) to PDP//发送token_id给PDP
}
}
end
  1. AAP 发送访问凭据 access

当访问授权点AAP发送访问凭据access的条件达成时,PEP 首先得到 access,然后将access发送给主体S以及日志部署点LDP。

6.令牌结构

6.1 属性通行证

image-20231116142313593

6.2 访问凭证

image-20231116142340698