基于CP-ABE和区块链的数据安全共享方法①

2019-11-15 07:06陈丽炜范冰冰
计算机系统应用 2019年11期
关键词:密文密钥加密

黄 穗,陈丽炜,范冰冰

(华南师范大学 计算机学院,广州 510631)

1 引言

随着社会信息化的不断提高,各类信息系统积聚着大量数据资源,这些数据普遍存在难以融合关联的问题,将会使产业间陷入“数据孤岛”式困境.数据共享有效促进各类数据交叉引用,提升数据的潜在价值,带来巨大的社会和经济效益[1-4].然而,越来越多的数据涉及用户个人隐私或相关隐私,如医疗档案中的临床诊断结果、出生日期、医疗卡号等,如果共享不当,将不可避免产生隐私泄露问题[5,6].对于这部分数据,一般采取细粒度的访问控制和数据加密技术[7],在有限的范围和时间段内对特定的人或组织开放,按照“特定用户—特定场景—特定资源”的方式进行细粒度共享,同时对数据共享过程进行追踪.区块链[8]具有不可篡改、可追溯和可编程的特性,基于区块链构建安全共享框架可用于满足数据限制开放和透明监管的安全需求.

Xu 等人[9]根据隐私数据共享的应用需求,提出一种将区块链作为软件连接件的系统架构.在区块链上实现访问控制、交易验证、数据注册和密钥分发等业务逻辑,将数据存储、密钥生成、数据加密等操作放在区块链下进行,链上与链下之间通过交易和智能合约进行数据交互.但没有详细阐述具体的技术细节和算法思想.Di Francesco Maesa D 等人[10]利用比特币区块链实现一种基于属性的访问控制方案.该方案通过策略创建交易PCT (Policy Creation Transaction)和权限转移交易(Right Transfer Transaction)实现策略的创建、更新、撤销和用户间访问权限转移,区块链作为分布式数据库存储XACML 策略和操作日志.资源的访问权限可以由最后一个权限所有者在区块链上发起交易转移到合法请求者,无需资源所有者处理.此外,任何用户都可以对交易记录进行审计,实现对访问策略全周期透明管理.该方案的区块链用于维护分布式节点数据的一致性算法是基于算力的,因而系统运作存在较大的计算开销.文献[11]提出一种结合分布式文件系统IPFS、以太坊区块链和基于属性加密的访问控制框架.在此框架下,数据拥有者能够在区块链上通过交易的方式将密钥分发给数据请求者,同时指定访问策略来加密共享数据.此外,作者通过智能合约实现了密文的关键字搜索功能,解决了传统云服务器无法返回搜索结果和容易返回错误结果的问题.Jemel 等人[12]在区块链和密文-策略基于属性的加密(CP-ABE,Ciphetext-Policy Attribute-Based Encryption)基础上,提出一种名为Timely CP-ABE with Blockchian 的访问控制方案,通过广播交易将带有时间属性的访问策略发布到区块链,只有在特定时间内用户属性满足访问策略的请求者才能获取解密密钥.该方案适合处理和解决开放共享环境下数据保护所面临的细粒度问题,既有效减少由密钥撤回所带来的开销,又可追踪用户发布和获取数据访问权限的操作记录.然而存在以下不足:(1)区块存储容量有限,难以通过交易的形式实时部署众多的访问策略.(2)数据请求者的属性集合被封装在交易信息,并被广播到全网所有节点公开可见,极易被恶意节点盗用生成正确的用户密钥.

本文通过借鉴上述方案的优点,提出了一种基于CP-ABE 和区块链的数据安全共享框架,主要在以下方面进行改进:

(1)摒弃文献[12]基于交易进行权限管理的方式,以采用智能合约部署访问控制代替.

(2)摒弃文献[12]将访问策略和用户属性公开存放在区块的方法,以将其存储在区块链数据库上,并设置访问限制代替.

(3)将数据集元数据发布到区块链上,对数据集进行注册认证,为数据的确权提供保障的同时,供数据请求者发现数据.

2 框架相关技术

2.1 区块链

区块链是一种以数据区块为基本单位的按时间顺序组合形成的链式数据结构,并以密码学方式保证的不可篡改和不可伪造的分布式账本.在区块链1.0 时代,区块链利用共识机制和P2P 网络技术实现区块数据传输、验证以及冗余备份,利用加密的带时间戳的链式区块结构存储数据,通过后序区块对前序区块进行验证,并从时间维度进行关联,保证区块数据不可篡改且可追溯,仅仅是一种被用来保证去中心化架构下数字货币交易可信性的技术方案的一部分[13].进入2.0 时代,区块链融合以智能合约为代表的链上脚本技术,实现各种顶层复杂应用场景的业务逻辑,为区块链可编程特性提供了基础,极大拓宽了区块链的应用领域[14,15].区块链结构如图1所示.

图1 区块链结构示意图

2.2 智能合约

智能合约是一种在区块链上自动验证、不可逆转、可编程执行的计算机协议[16].最早是由密码学家Nick Szabo 在1994年提出,设想将传统合同条款转换成代码,并将它们嵌入到可以自动执行的硬件或软件中,以便最大限度地减少交易者之间对可信第三方的依赖.区块链技术的诞生,以及基于C++、Solidity 等高级语言的智能合约开发平台的发布,使设计具有可用性的智能合约变成现实.智能合约本质上是一个状态机,包括一组可执行函数、状态变量以及标识地址.合约部署者指定相关的权限确认逻辑并把已完成编译的合约上传到区块链后,其他用户可以通过标识地址向指定合约发起一笔事务(包括执行函数所需的输入参数),从而触发对应合约中相应的执行函数,返回执行结果并更新合约的状态.因此,智能合约赋予区块链计算处理能力,开发者可以通过合理的逻辑函数管理和控制链上数据.

2.3 密文—策略基于属性的加密

密文—策略基于属性的加密运用密码机制保护数据,由发送方规定访问密文的策略,将属性集合与访问资源相关联,接收方可以根据自己的授权属性访问密文信息,适合隐私数据共享等访问控制类应用[17,18].CP-ABE 主要由4 个多项式算法组成:

(1)初始化:初始化算法为随机化算法,一般在可信的密钥分发中心上执行.如式(1),算法输入安全系数λ和属性空间U,生成系统公钥PSK和系统主密钥MSK.

(2)密钥生成:密钥生成算法为随机化算法,一般由可信的密钥分发中心执行.如式(2),根据系统公钥PSK、系统主密钥MSK和数据请求者提交的属性集合A,为数据请求者生成与属性集合相关联的用户密钥USK.

(3)加密:加密算法为随机化算法,由数据拥有者执行.如式(3),算法输入系统公钥PSK、待加密消息T和与访问策略相关联的访问控制结构Acp,生成基于属性加密的密文CT.只有拥有满足访问策略的请求者才能解密密文CT.

(4)解密:解密算法为确定性算法,由数据请求者执行.如式(4),算法的输入为系统公钥PSK、用户密钥USK和密文CT,如果属性集合A满足访问策略,算法自动解密密文并获得相应的明文数据T.

3 DOB 框架

3.1 系统模型

DOB 框架由数据注册模块、密钥生成模块、策略管理模块和传输模块组成,通过4 个模块的相互协同,实现数据的安全共享.DOB 框架包含3 个实体:

1) DO:数据拥有者,实际上是拥有数据的个人或者机构.主要负责发布数据集元数据,设置访问策略,分发密钥和传输基于属性加密的密文.

2) DR:拥有部分属性集合的数据请求者,只有属性集合符合访问策略才能拥有访问数据集的权限.

3) AC:可信的密钥分发中心,负责生成公开参数,为DO 和DR 生成和分发密钥.

3.1.1 数据注册模块

数据注册模块将数据以相对成熟的元数据标准为核心进行统一描述后,生成包含数据集哈希值、数据集所有者等特定标识字段的元数据,通过智能合约将元数据发布到区块链网络上,供所有节点浏览发现数据集,利用区块日志不可篡改的特性为数据集来源追踪和数字资产确权提供保障.

3.1.2 密钥生成模块

密钥生成模块负责生成加密数据所需的密钥.数据加密算法一般分为对称加密算法和非对称加密算法.对称加密算法也称为单密钥算法,要求发收信双方在建立通信之前,商定一个用于加解密数据的密钥.非对称加密算法需要公钥和私钥对数据进行加密和解密.相比于非对称加密,对称加密的计算量小,加密速度快,当加密大量数据时其实现效率要比非对称加密高6-10 倍,但密钥的分发缺乏安全,算法的安全性在很大程度上依赖于密钥.考虑到需要加密的共享数据集数量比较大,为了保证高效的加解密效率,同时有效避免恶意攻击者通过暴力破解的方式获取密钥,本模块采用对称加密算法AES-256 加密数据,生成长度为256 位的密钥,该密钥由一对256 位随机数进行加法运算后执行哈希算法SHA256 得出.密钥管理和分发交由策略管理模块和传输模块处理.

3.1.3 策略管理模块

策略管理模块主要实现密文—策略基于属性的加密.在此模块里,AC 负责生成系统公钥、系统主密钥和用户密钥.DO 负责设置包含时间维度的访问策略,并将密钥和访问策略嵌入到密文中,密文只有在有效时间内才可被解密.DR 负责将用户密钥用于解密密文以获得密钥.

3.1.4 传输模块

传输模块主要利用智能合约设置用户节点的访问权限,同时运用序列化技术,实现系统公钥、用户属性、密文和用户密钥等在区块链上的安全高效传输.

3.2 运作流程

如图2所示,DOB 框架的运作流程为:

图2 DOB 框架运作流程图

① DO 随机生成256 位密钥对k1、k2,执行哈希算法获得对称加密密钥:k=SHA256(k1⊕k2).

② DO 调用智能合约在区块链发布数据集元数据.

③ DR 调用智能合约浏览数据集元数据,查看数据集详细描述信息.

④ DR 创建一笔交易向DO 发送访问请求,访问请求包括目标数据集标识名和目标数据集MD5 值.

⑤ DO 收到访问请求后,调用智能合约将密钥k1存储在链数据库上,设置访问权限仅对DR 开放访问.

⑥ DR 调用智能合约从链数据库中获取密钥k1.

⑦ AC 执行CP-ABE 初始化算法,输入安全参数和属性空间U,生成系统公钥PSK和系统主密钥MSK.

⑧ AC 通过智能合约将系统公钥PSK存储在链数据库上,将访问权限默认设置为被所有节点账户访问.

⑨ DO 和DR 调用智能合约从链数据库获取系统公钥PSK.

⑩ DO 执行CP-ABE 加密算法.输入系统公钥PSK、密钥k2和访问策略policy,生成密文k′2.其中,访问策略的有效时间T设置为:T≥1552312182∪T≤1583848182.

⑪ DO 调用智能合约将密文k′2存储在链数据库上,添加访问限制仅对DR 开放.

⑫ DR 调用智能合约从链数据库获取密文k′2.

⑬ DR 调用智能合约将其带有当前时间的属性集合A存储在链数据库上,并添加访问限制仅对AC 开放.

⑭ AC 调用智能合约从链数据库获取属性集合A.

⑮ AC 执行CP-ABE 密钥生成算法,输入系统主密钥MSK,系统公钥PSK和属性集合A,生成用户密钥USK.

⑯ AC 调用智能合约将USK存储在链数据库上,添加访问限制仅对DR 开放.

⑰ DR 调用智能合约从链数据库获取USK.

⑱ DR 执行CP-ABE 解密算法,输入系统公钥PSK、用户密钥USK和密文k2′,若DR 的属性集合满足密文中的访问策略policy,则自动解密密文获得密钥k2,从执行哈希运算获得对称加密密钥:k=SHA256(k1⊕k2).否则,无权访问数据集.

3.3 智能合约算法细节

DOB 框架调用的智能合约共有12 个功能入口,其算法描述如下:

(1)发布元数据:此算法只有DO 才能执行.DO 创建一个多索引表,定义元数据所有字段的数据类型,将数据集标识名设置为多索引表的主索引,最后把输入的元数据序列化,存储在多索引表中.

算法1.发布元数据输入:元数据(metadata),数据集标识名(dataset’s identifier)输出:空值⇐1.if vertify(DO’s account) false then 2.throw;3.end 4.else 5.typedef a multi-index table 6.set dataset’s identifier of metadata as index 7.serialize (metadata)8.break;9.end

(2)查询元数据:此算法由DR 执行.DR 根据数据集标识名查找对应的多索引表中的数据对象,如果查找成功,返回数据集元数据.否则,查找失败.

算法2.查询元数据输入:数据集标识名(dataset’s identifier)输出:元数据(metadata)⇐1.metadata find (dataset’s identifier)2.if metadata is null then 3.throw;4.end 5.else 6.return metadata 7.end

(3)序列化密钥k1:此算法由DO 执行.DO 创建一个多索引表,将DO 节点账户名设置为多索引表的主索引,将输入的密钥k1序列化,存储在多索引表中,最后设置多索引表访问权限仅对DR 开放.

算法3.序列化密钥k1输入:密钥k1,DO 节点账户(DO’s account)输出:布尔值(bool)1.typedef a multi-index table 2.set DO’s account as index 3.serialize (k1)⇐4.authorizeUsers(DR’s account) true 5.return true;6.end

(4)提取密钥k1:此算法只有DR 才能执行.算法初始会验证运行节点账户是否属于DR,若验证不成功,则终止算法.若验证成功,DR 根据DO 节点账户名查找对应的多索引表中的密钥k1,如果查找成功,提取密钥k1.否则,提取失败.

算法4.提取密钥k1输入:DO 节点账户(DO’s account)输出:密钥k1⇐1.if vertify (DR’s account) false then 2 throw;3 end 4 else⇐5 k1 find (DO’s account)6 if k1 is null then 7 throw;8 else 9 return k1 10 end 11 end

(5)序列化系统公钥:此算法由AC 执行.AC 创建一个多索引表,将其节点账户名设置为多索引表的主索引,并将系统公钥序列化,存储在多索引表.

算法5.序列化系统公钥输入:系统公钥(PSK),AC 节点账户(AC’s account)输出:空值1.typedef a multi-index table 2.set AC’s account as index 3.serialize (PSK)4.break;5.end

(6)提取系统公钥:此算法由DO 和DR 执行.根据AC 节点账户名查找对应多索引表的系统公钥,若查找成功则提取系统公钥.否则,提取失败.

算法6.提取系统公钥输入:AC 节点账户(AC’s account)输出:系统公钥(PSK)⇐1.PSK find (AC’s account)2.if PSK is null then 3.throw;4.end 5.else 6.return PSK 7.end

(7)序列化密文k′2:此算法由DO 执行.DO 创建一个多索引表,将其节点账户名设置为多索引表的主索引,并把密文k′2序列化,存储在多索引表中.最后设置多索引表访问权限仅对DR 开放.

算法7.序列化密文k′2输入:密钥k1,DO 节点账户(DO’s account)输出:布尔值(bool)1.typedef a multi-index table 2.set DO’s account as index k′2 3.serialize ( )⇐4.authorizeUsers (DR’s account) true 5.return true;6.end

(8)提取密文k′2:此算法只有DR 才能执行.初始情况下,算法会验证运行节点账户是否属于DR,若验证不成功,则终止算法.若验证成功,DR 根据DO 节点账户名查找对应的多索引表中的密文k′2,如果查找成功,提取密文k′2.否则,提取失败.

算法8.提取密文k′2输入:DO 节点账户(DO’s account)k′2输出:密文⇐1.if vertify (DR’s account) false then 2.throw;3.end 4.else k′2⇐5.find (DO’s account)k′2 6.if is null then 7.throw;8.else k′2 9.return 10.end 11.end

(9)序列化用户属性:此算法由DR 执行.DR 创建一个多索引表,定义用户属性所有字段的数据类型,将其节点账户名设置为多索引表的主索引,最并将用户属性序列化,存储在多索引表中.最后设置多索引表访问权限仅对AC 开放.

算法9.序列化用户属性输入:DR 节点账户(DR’s account),用户属性(attribute)输出:布尔值(bool)1.typedef a multi-index table 2.set DR’s account as index 3.serialize (attribute)⇐4.authorizeUsers(AC’s account) true 5.return true;6.end

(10)提取用户属性:此算法只有AC 才能执行.算法初始会验证运行节点是否为AC 节点,若验证不成功,则终止算法.若验证成功,AC 根据DR 节点账户名查找对应的多索引表中的用户属性,如果查找成功,提取用户属性.否则,提取失败.

算法10.提取用户属性输入:DR 节点账户(DR’s account)输出:用户属性(attribute)⇐1.if vertify (AC’s account) false then 2.throw;3.end 4.else⇐5.attribute find (DR’s account)6.if attribute is null then 7.throw;8.else 9.return attribute 10.end 11.end

(11)序列化用户密钥:此算法由AC 执行.AC 创建一个多索引表,将自身节点账户名设置为该多索引表的主索引,并将用户密钥序列化,存储在多索引表中.最后设置多索引表访问权限仅对DR 开放.

算法11.序列化用户密钥输入:AC 节点账户(AC’s account),用户密钥(USK)输出:布尔值(bool)1.typedef a multi-index table 2.set AC’s account as index 3.serialize (USK)⇐4.authorizeUsers (DR’s account) true 5.return true;6.end

(12)提取用户密钥:此算法只有DR 才能执行.算法初始会验证运行节点是否为DR 节点,若验证不成功,则终止算法.若验证成功,DR 根据AC 节点账户名查找对应多索引表中的用户密钥,如果查找成功,提取用户密钥.否则,提取失败.

算法12.提取用户密钥输入:AC 节点账户(AC’s account)输出:用户密钥(USK)⇐1.if vertify (DR’s account) false then 2.throw;3.end 4.else⇐5.USK find (AC’s account)6.if USK is null then 7.throw;8.else 9.return USK 10.end 11.end

4 实验结果及分析

4.1 实验准备

实验部署在1 台PC 机上,其配置如下:Intel Xeon(R) E5-2407 v2(2.4 GHz)8 核CPU,16 GB 内存.操作系统采用Ubuntu 16.04.10 LTS desktop,区块链采用EOSIO 平台部署,智能合约采用C++开发,密钥采用Openssl 工具产生,密文—策略基于属性的加密采用基于双线性对的密码函数库(Pairing-Based Cryptography library,PBC)实现.

实验选取1999年1月至2008年12月期间的“130 家医院糖尿病患者病例”数据集[19],包含一个diabetic_data.csv 文件,存有10 万条糖尿病患者的医疗档案,包括医疗卡号、性别、年龄、治疗情况等隐私信息.根据diabetic_data 数据集的特点,将数据集元数据分为外部描述核自定义的内部描述两部分,外部描述按照数据目录词汇表标准[20]定义,如表1.内部描述选用自定义描述词汇,如表2.diabetic_data 数据集元数据,如图3.

初始条件下,在区块链网络上设置两个用户节点和一个AC 节点,每个用户节点既是数据拥有者,又是数据请求者.实验通过控制变量,在同一环境上分别运行Timely CPABE with Blockchain 方案和DOB 框架,二者皆采用相同的访问策略和属性集合.实验一共分为7 次,每次实验比上次增加5 种属性数量,每次实验重复10 遍,最后取得平均值.

表1 diabetic_data 数据集外部描述词汇

表2 diabetic_data 数据集内部描述词汇

图3 diabetic_data 数据集元数据

4.2 实验结果及分析

4.2.1 运行时间分析

经实验测试,两种方案的系统运行时间如图4.

图4 系统运行时间示意图

从图4可以看出,随着属性数量的增加,所需传输的密文和用户密钥的空间大小逐渐增大,使得二者的系统运行时间逐步增加.相对于Timely CPABE with Blockchain 方案,DOB 框架的平均系统运行时间增加了31.18%,主要原因是采用序列化方法在链数据库上存储和传输密文、相关密钥和用户属性,增加链数据库的读写次数.但是,系统运行时间远远小于1 秒,仍处于合理范围之内.

4.2.2 安全性分析

Timely CPABE with Blockchain 方案将合法请求者的用户属性公开存取在区块,恶意节点可以盗用合法者的用户属性生成USK,从而将获得的密钥k2与密钥k1结合生成数据加密密钥k.DOB 通过在链数据库上设置访问权限,只有授权的数据请求者才能提取出密文、用户密钥USK和密钥k1,因此DOB 框架能降低USK被盗用的风险.

5 结论与展望

根据数据共享的安全需求,本文提出一种基于CPABE 和区块链的数据安全共享框架,通过带有访问权限的智能合约部署密文—策略基于属性的加密,提高了获取和跟踪共享数据访问许可的自动化程度,使数据的管理使用权真正掌握在数据拥有者手中.实验结果表明,DOB 框架的综合性能比Jemel 等人提出的Timely CPABE with Blockchain 方案表现得要好,具有一定的积极意义.由于访问策略是数据拥有者事先定义的,DOB 框架的访问机制相对固定,适用于数据集自身更新频度小、共享范围相对确定的场景,以避免数据加密的密钥频繁更换.当然,方案仍存在一些值得完善的地方,例如属性灵活撤销、高效访问结构的设计以及访问策略动态更新,以应用于动态共享场景,将是下一步的研究方向.

猜你喜欢
密文密钥加密
一种支持动态更新的可排名密文搜索方案
幻中邂逅之金色密钥
幻中邂逅之金色密钥
基于模糊数学的通信网络密文信息差错恢复
嵌入式异构物联网密文数据动态捕获方法
基于广义logistic混沌系统的快速图像加密方法
保护数据按需创建多种加密磁盘
一种新的密文策略的属性基加密方案研究
Android密钥库简析
加密与解密