基于Hyperledger Fabric 的数据访问控制方法

1. 背景介绍

  1. 目前区块链平台基本没有智能合约的访问控制模块,智能合约被公开而不可更改地存储在区块链上,没有访问控制权限的主体可以随意调用其中的任何方法。
  2. 每编写新的智能合约需要从头到尾实现访问控制,开发成本高且不能在不同合约之间复用。
  3. 区块链平台的文件系统或相应的键值对状态数据库不适合对访问控制规则等数据的存储和管理。
  4. 区块链中没有集中化的访问控制元数据管理方法(对管理员权限等的管理), 多管理员对元数据的修改较难达成一致。

2. 解决办法

为了解决现有区块链中存在的没有访问控制权限的主体随意调用智能合约中的方法、智能合约之间不能复用访问控制方法、区块链的存储模式不方便对访问 控制规则数据的管理以及多管理员对访问控制元数据的修改难达成一致的问题。

  1. 区块链节点接收来自于客户端的请求,并判断该请求是元数据管理请求,非元数据管理请求,还是访问鉴权请求,如果是元数据管理请求,则转入步骤(2),如果是非元数 据管理请求,则转入步骤(4),如果是访问鉴权请求,则转入步骤(6);
  2. 区块链节点对该元数据管理请求对应的访问控制权限进行鉴定,如果鉴定通过,则转入步骤(3),否则过程结束;
  3. 区块链节点将元数据管理请求添加到区块链中的待办请求列表的末尾,并在 该元数据管理请求出现在待办请求列表头部的时候,通知元数据表中的管理员参与投票, 并在投票结果显示通过时执行元数据管理请求对应的管理操作,从而完成对元数据表、公 共客体访问规则表、以及表结构表的更新;
  4. 区块链节点对该非元数据管理请求对应的访问控制权限进行鉴定,如果鉴定通过,则转入步骤(5),否则过程结束;
  5. 区块链节点执行上述非元数据管理请求对应的管理操作,从而完成对用于管理员的主体属性表和客体访问规则表的更新
  6. 区块链节点根据访问鉴权请求对应的客体从用于管理员的客体访问规则表中取出对应的访问规则,从用于管理员的主体属性表中取出该访问规则对应的主体属性,并将该主体属性代入访问规则中求值,返回鉴权结果。

3. 具体细节

  1. 步骤(1)之前初始化的操作。

即建立表结构表、元数据表、公共客体访问规则表、用于管理员的主体属性表和客体访问规则表。

  • 表结构表中反映了表类型、表名称、属性名称、属性类型、属性默认值、是否主键之间的映射关系。
  • 元数据表中反映了管理员标识符、管理员公钥、表名称以及表类型之间的映射关系。
  • 公共客体访问规则表中反映了客体名称和访问规则之间的映射关系。
  • 管理员的主体属性表反映了主体名称与主体安全属性之间的映射关系。
  • 管理员的客体访问规则表中反映了客体名称与客体访问规则之间的映射关系。
表结构表

将表类型、表名称作为键值对中的键,将属性名称、属性类型、属性默认值、是否主键作为键值对中的值存入区块链的键值对数据库中。
存入之前检查该键对应的数据是否存在,如果不存在则存入该数据,如果存在则结束该条数据的存入过程。其对应的映射关系如下:

[表类型][表名][属性名称][属性类型][属性默认值][主键]
元数据表

将表类型、表名称、管理员标识符作为键值对中的键,将表中所有数据作为键值对中的值存入到区块链的键值对数据库中,在插入每条数据之前检查数据中每个项与表结构表中元数据表中对应的属性类型是否匹配,检查插入数据是否已在表中存在,如果匹配且不存在,则允许插入,否则拒绝该数据的插入,格式如下所示:

[表类型][表名称][管理员标识符][管理员标识符][管理员公钥][表类型][表名称]
公共客体访问规则表

用于管理员的主体属性表和客体访问规则表的建立过程是插入数据之前检查数据中每个项与表结构表中元数据表中对应的属性类型是否匹配,检查插入数据是否已在表中存在,如果匹配且不存在,则允许插入,否则拒绝该数据的插入。
格式如下所示:

 [表类型][表名][主键属性值][所有属性值]

4. 业务步骤

基于Hyperledger Fabric 的数据访问控制方法_第1张图片

  1. 区块链节点接收来自于客户端的请求,并判断该请求是元数据管理请求,非元 数据管理请求,还是访问鉴权请求,如果是元数据管理请求,则转入步骤(2),如果是非元数 据管理请求,则转入步骤(4),如果是访问鉴权请求,则转入步骤(6); 需要注意的是在本步骤之前初始化的操作,即建立表结构表、元数据表、公共客体访问规则表、用于管理员的主体属性表和客体访问规则表,其中表结构表中反映了表类型、表名称、属性名称、属性类型(整型、浮点型和字符串类型)、属性默认值、是否主键之间的映射关系,元数据表中反映了管理员标识符、管理员公钥、表名称以及表类型(主体即用户、客体)之间的映射关系,公共客体访问规则表中反映了客体名称和访问规则之间的映射关系,用于管理员的主体属性表反映了主体(即用户)名称与主体安全 属性之间的映射关系,用于管理员的客体访问规则表中反映了客体名称与客体访问规则之间的映射关系。其中表结构表的建立过程是将表类型、表名称作为键值对中的键,将属性名称、属 性类型(整型、浮点型和字符串类型)、属性默认值、是否主键作为键值对中的值存入区块链 的键值对数据库中,存入之前检查该键对应的数据是否存在,如果不存在则存入该数据,如 果存在则结束该条数据的存入过程。元数据表的建立过程是将表类型、表名称、管理员标识符作为键值对中的键,将表中所有数据作为键值对中的值存入到区块链的键值对数据库中,在插入每条数据之前检查 数据中每个项与表结构表中元数据表中对应的属性类型是否匹配,检查插入数据是否已在表中存在,如果匹配且不存在,则允许插入,否则拒绝该数据的插入, 其他表的建立过程是插入数据之前检查数据中每个项与表结构表中元数据表中对应的属性类型是否匹配,检查插入数据是否已在表中存在,如果匹配且不存在,则允许插 入,否则拒绝该数据的插入。
  2. 区块链节点对该元数据管理请求对应的访问控制权限进行鉴定,如果鉴定通过,则转入步骤(3),否则过程结束;
    本步骤具体包括以下子步骤:
    1. 区块链节点根据元数据管理请求中的管理员标识符、请求操作表类型、请求操作表名称在元数据表中是否存,如果存在,转入步骤(2-2),否则表示管理员鉴权失败,过程结束;
    2. 区块链节点根据元数据表中管理员的公钥并使用非对称加密算法验证元数据管理请求中的签名信息的是否合法,如果合法,表示管理员鉴权通过,否则表示管理员鉴 权失败,过程结束。
  3. 区块链节点将元数据管理请求添加到区块链中的待办请求列表(To-do list) 的末尾,并在该元数据管理请求出现在待办请求列表头部的时候,通知元数据表中的管理员参与投票,并在投票结果显示通过时执行元数据管理请求对应的管理操作,从而完成对 元数据表、公共客体访问规则表、以及表结构表的更新;具体而言,投票结果满足预定规则时,表示投票结果通过,例如,50%的投票者同 意,或者50个投票者同意。
  4. 区块链节点对该非元数据管理请求对应的访问控制权限进行鉴定,如果鉴定 通过,则转入步骤(5),否则过程结束; 本步骤具体包括以下子步骤:
    1. 区块链节点根据非元数据管理请求中的管理员标识符、请求操作表类型、请 求操作表名称在元数据表中是否存在,如果存在,转入步骤(4-2),否则表示管理员鉴权失败,过程结束;
    2. 区块链节点根据元数据表中管理员的公钥并使用非对称加密算法验证非元 数据管理请求中的签名信息的是否合法,如果合法,表示管理员鉴权通过,否则表示管理员鉴权失败,过程结束。
  5. 区块链节点执行上述非元数据管理请求对应的管理操作,从而完成对用于管 理员的主体属性表和客体访问规则表的更新。
  6. 区块链节点根据访问鉴权请求对应的客体从用于管理员的客体访问规则表中取出对应的访问规则,从用于管理员的主体属性表中取出该访问规则对应的主体属性,并 将该主体属性代入访问规则中求值,返回鉴权结果。

链码实现

思考中…

注:本文章参考于 武汉凤链科技有限公司 的专利《一种基于区块链的访问控制方法和系统》

你可能感兴趣的:(区块链优化方案)