本公开涉及数据库及大数据技术领域,尤其涉及一种实现列加密的方法、装置、设备及存储介质。
背景技术:
在hive数据仓库中,表数据可以在sparksql或sparkthriftserver(sparkthriftserver是spark社区基于hiveserver2实现的一个thrift服务,旨在无缝兼容hiveserver2)等客户端查询访问。由于hive不具备直接对列数据加密的功能,用户如果在使用hive过程中希望对敏感数据列加密,并且要求真实数据只能通过hive进行查询,那么当前hive无法满足用户的需求。
apacheranger提供集中式的权限管理框架,可以对hadoop生态中的hdfs、hive、yarn、kafka、storm和solr等组件进行细粒度的权限访问控制,并且提供了webui方便管理员操作。集成ranger可实现对hive敏感列数据的脱敏,但需要额外集成ranger组件,使用ranger对hive敏感列数据进行脱敏后,在hive客户端查看到的也是脱敏后的数据,无法查看真实数据。另外,此种脱敏方式只针对查询出来的数据进行脱敏,对于存储文件中的数据并未进行脱敏,如果其他用户可以拿到数据的原始文件,则可以直接读取到未脱敏数据,因此无法保障原始数据文件的安全性。
技术实现要素:
有鉴于此,本公开提供一种实现列加密的方法、装置、设备及存储介质,用于解决数据库表不支持列加密及查询的技术问题。
图1为本公开提供的一种实现列加密的方法步骤流程示意图,该方法应用于sql引擎所在的设备,该方法包括:
步骤101.接收客户端发送的sql语句;当所述sql语句为创建表的sql语句时执行步骤102;当所述sql语句为插入记录的sql语句时,执行步骤103;当所述sql语句为查询记录的sql语句时,执行步骤104;
步骤102.所述sql语句中携带表属性,所述表属性中包括加密列属性,所述加密列属性用于指定所创建的表中需要加密的列,在解析和执行所述sql语句时,将所述表属性存储到元数据服务中;
步骤103.在解析所述sql语句的过程中,判断所述表的元数据中是否包括加密列属性;当判定包括加密列属性时,在生成逻辑计划之前使用预设的秘钥和预设加密算法对所述加密列属性中指定的列的数据进行加密;
步骤104.在解析所述sql语句的过程中,判断所述表的元数据中是否包括加密列属性;当判定包括加密列属性时,在sql引擎获取到查询结果后使用预设的秘钥和预设加密算法对所述加密列属性中指定的列的结果数据进行解密,再将查询结果返回给客户端。
基于本公开实施例的另一方面,所述方法还包括:在所述创建表的sql语句中携带的表属性中,除携带加密列属性外还携带有加密算法属性;所述预设的秘钥为数据库级的公共秘钥;所述预设加密算法为所述加密算法属性指定的加密算法。
基于本公开实施例的另一方面,所述方法还包括:
在所述创建表的sql语句中携带的表属性中,除携带加密列属性外还携带加密算法属性和加密秘钥属性;
在所述接收客户端发送的sql语句之后,还包括获取会话中设置的会话秘钥的步骤;
当所述sql语句为插入记录的sql语句时,在生成逻辑计划之前,判断所述会话秘钥是否与元数据中的加密秘钥属性值一致,若一致则基于所述加密秘钥属性和所述加密算法属性对所述加密列属性中指定的列的数据进行加密;若不一致则终止所述sql语句的解析和执行,向客户端反馈错误信息;
当所述sql语句为查询记录的sql语句时,在sql引擎获取到查询结果后,在所述会话秘钥与元数据中的加密秘钥属性值一致的情况下,基于所述加密秘钥属性和所述加密算法属性对所述加密列属性中指定的列的结果数据进行解密;在所述会话秘钥与元数据中的加密秘钥属性值不一致的情况下,对所述加密列属性中指定的列的结果数据不进行解密。
基于本公开实施例的另一方面,所述表为hive数据仓库中的表,所述客户端为hive数据仓库的客户端;当所述客户端为非hive数据仓库的客户端时,在不存在所述数据库级的公共秘钥或未获取到会话秘钥的情况下,在执行所述查询语句时,所获得的结果为表中实际存储的未解密的数据。
图2为本公开一实施例提供的一种实现列加密的装置结构示意图,该装置200中的各功能模块可以采用软件、硬件或软硬件相结合的方式实现。该装置200应用于sql引擎所在的设备,该装置200包括:
通信模块210,用于接收客户端发送的sql语句;以及将sql语句的执行结果返回给客户端;
引擎模块220,用于解析和执行所述sql语句;所述引擎模块220包括:
创建子模块221,用于解析和执行创建表的sql语句;将所述创建表的sql语句中携带的表属性存储到元数据服务中;所述表属性中包括加密列属性,所述加密列属性用于指定所创建的表中需要加密的列;
插入子模块222,用于解析和执行插入记录的sql语句;在解析所述sql语句的过程中,判断所述表的元数据中是否包括加密列属性;当判定包括加密列属性时,在生成逻辑计划之前使用预设的秘钥和预设加密算法对所述加密列属性中指定的列的数据进行加密;
查询子模块223,用于解析和执行查询记录的sql语句;在解析所述sql语句的过程中,判断所述表的元数据中是否包括加密列属性;当判定包括加密列属性时,在获取到查询结果后使用预设的秘钥和预设加密算法对所述加密列属性中指定的列的结果数据进行解密,再将查询结果通过通信模块210返回给客户端。
基于本公开实施例的另一方面,在所述创建表的sql语句中携带的表属性中,除携带加密列属性外还携带有加密算法属性;所述预设的秘钥为数据库级的公共秘钥;所述预设加密算法为所述加密算法属性指定的加密算法。
基于本公开实施例的另一方面,在所述创建表的sql语句中携带的表属性中,除携带加密列属性外还携带加密算法属性和加密秘钥属性;
所述通信模块210还用于获取会话中设置的会话秘钥的步骤;
所述插入子模块222还用于在生成逻辑计划之前,判断所述会话秘钥是否与元数据中的加密秘钥属性值一致,若一致则基于所述加密秘钥属性和所述加密算法属性对所述加密列属性中指定的列的数据进行加密;若不一致则终止所述sql语句的解析和执行,通过通信模块210向客户端反馈错误信息;
所述查询子模块223还用于在sql引擎获取到查询结果后,在所述会话秘钥与元数据中的加密秘钥属性值一致的情况下,基于所述加密秘钥属性和所述加密算法属性对所述加密列属性中指定的列的结果数据进行解密;在所述会话秘钥与元数据中的加密秘钥属性值不一致的情况下,对所述加密列属性中指定的列的结果数据不进行解密。
本公开通过对sql引擎进行改进,在不需要引入其他组件的情况下,使得数据库能够支持基于列的加密和查询功能,提高了数据库的安全性。
附图说明
为了更加清楚地说明本公开实施例或者现有技术中的技术方案,下面将对本公开实施例或者现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本公开中记载的一些实施例,对于本领域普通技术人员来讲,还可以根据本公开实施例的这些附图获得其他的附图。
图1为本公开提供的一种实现列加密的方法步骤流程示意图;
图2为本公开一实施例提供的一种实现列加密的装置结构示意图;
图3为本公开一实施例中在hive数据仓库中的建表sql语句结构;
图4为本公开一实施例中插入记录的sql语句的处理流程图;
图5为本公开一实施例中查询sql语句的处理步骤流程图;
图6为本公开一实施例提供的一种电子设备结构示意图。
具体实施方式
在本公开实施例使用的术语仅仅是出于描述特定实施例的目的,而非限制本公开实施例。本公开实施例中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其它含义。本公开中使用的术语“和/或”是指包含一个或多个相关联的列出项目的任何或所有可能组合。
应当理解,尽管在本公开实施例可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本公开实施例范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,此外,所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。
本公开的基本思想是,对数据仓库/数据库的sql引擎(包括sql语句的解析和执行功能)进行改进,为表添加有关加密列的表属性,并加表属性存储在元数据服务中,在对表的进行记录插入和查询处理时,从元数据服务读取表属性,根据表属性中设置的加密列等相关属性对相应的列数据进行加解密处理。
为了保障不同级别的数据安全性,本公开提供两种实现方案,分别对应两种安全等级,一种采用数据库级的公共秘钥对表的加密列进行加密,一种采用表级别的私有秘钥对表的加密列进行加密,以下结合实施例分别对两种方案进行描述。
本公开实施例所使用的数据仓库/数据库(例如hive、oracle等)需要支持表属性设置,在创建表时需要为表增加有关列加密的属性。图3示例了在hive数据仓库中的建表sql语句结构,其中tblproperties为表属性。
在本公开采用数据库级的公共秘钥的一实施例中,数据仓库/数据库表属性中与列加密有关的属性可仅包括加密列属性(encrypt.columns),不包括加密算法属性(encrypt.algorithm)和加密秘钥属性(encrypt.key),加密算法属性和加密秘钥属性由数据仓库/数据库本身提供,提供数据仓库/数据库级别的列加密安全性,对数据仓库/数据库中的所有表的加密列使用统一的加密算法和加密秘钥,sql引擎在进行sql语句解析和执行时,若判断到表元数据中设置了加密列属性,则直接从数据仓库/数据库字典或公共配置参数中读取加密算法和加密秘钥(简称公共秘钥),采用数据仓库/数据库的公共秘钥对加密列进行加解密的操作。
在本公开采用数据库级的公共秘钥的另一实施例中,数据仓库/数据库表属性中与列加密有关的属性可仅包括加密列属性和加密算法属性,加密秘钥由数据仓库/数据库提供,数据仓库/数据库中的不同的表可设置不同的加密算法,sql引擎在进行sql语句解析和执行时,若判断到表元数据中设置了加密列属性和加密算法属性,则直接从数据仓库/数据库字典或公共配置参数中读取加密秘钥并采用加密算法属性指定的加密算法对加密列进行加解密的操作。
在本公开采用表级别的私有秘钥一实施例中,数据仓库/数据库表属性中与列加密有关的属性包括加密列属性、加密算法属性和加密秘钥属性,表属性中的加密秘钥属性即设置了表的私有秘钥,sql引擎在进行sql语句解析和执行时,若判断到表元数据中设置了加密列属性和加密秘钥属性时,会读取会话环境变量中用户设定的会话秘钥,只有会话秘钥与加密秘钥属性值一致时,才允许对表进行插入记录的操作。在查询表记录时,如果会话秘钥与加密秘钥属性值不一致则反馈加密的列数据,用户看不到明文,从而保障表数据的安全。
数据仓库/数据库中,在接收到客户端发送的sql语句后,由sql引擎对sql语句进行解析和执行,通常分为词法语法解析阶段、语义解析阶段、逻辑计划阶段和物理计划阶段,在物理计划阶段生成物理计划后,由sql引擎执行物理计划获得最终的执行结果。
通常,标准sql语句包括创建表(create)的sql语句、插入(insert)记录的sql语句、查询(select)记录的sql语句、更新(update)记录的sql语句、删除(delete)记录的sql语句等,本公开实施例将以创建表的sql语句、插入记录的sql语句和查询记录的sql语句为例对本公开的技术方案进行详细说明,其它类型的sql语句的实现参考执行即可,本公开不再赘述。
对于创建表的sql语句来说,与标准sql语句的执行过程主要的区别在于,本公开中的创建表的sql语句中需要指定表属性,表属性中至少包括加密列属性,根据采用公共秘钥和私有秘钥的不同,还可包括加密算法属性和加密秘钥属性、加密类型(encrypt.type)属性等。sql引擎解析和执行创建表的语句后,将表属性存入元数据服务中,所述元数据服务用于专门存放元数据,可以位于数据库内部也可以为专门的元数据服务集群,以hive为例,元数据服务为metastore。本公开中加密算法可以采用aes、des和sm4等加密算法,本公开不做限定。
图4为本公开一实施例插入记录的sql语句的处理流程图,处理步骤如下:
步骤410.对接收到的sql语句进行解析,获取和绑定元数据;
例如,数据库中有一个员工employee表,该表有员工id、员工姓名name和密码password三个列或称为字段,在建employee表的时候通过在表属性中的encrypt.columns加密例属性指定加密列为name和password列。
接收到的插入sql语句示例如下:
insertintoemployeevalues(1,“tom”,“abcd123”)
sql引擎接收到sql语句后,对sql语句进行词法和语法解析,若解析通过则生成抽象语法树ast。在语法解析成功后,sql引擎会从元数据服务获取employee表的元数据并将所获取的元数据与employee表绑定,元数据中包括了有关employee表的结构信息、表位置信息、表属性等。
步骤420.判断所述表的元数据中是否包括加密列属性,若包括则执行步骤421,否则执行步骤431;
在解析过程中获取到employee表的元数据后,通过元数据中表属性的加密列属性的值判断该表是否设置了加密列。
步骤421.通过表属性判断加密列的加密方式,若采用的是数据库级的公共秘钥则读取公共秘钥,然后执行步骤423;若采用的是表级别的私有秘钥,则执行步骤422;
在本公开一实施例中,默认采用公共秘钥方式,即在不设置加密秘钥属性或加密秘钥属性和加密类型属性的情况下,默认采用公共秘钥方式对加密列属性指定的列的数据进行加密,sql引擎直接从数据库获取公共秘钥或公共秘钥和加密算法,若表属性中未设置加密算法属性,则使用默认加密算法,否则使用所指定的加密算法。若设置了加密秘钥属性或设置了加密类型属性且加密类型属性指定为私有秘钥类型,则判定该表采用的是私有秘钥方式。
步骤422.当采用私有秘钥方式时,读取会话当中用户设置的会话秘钥,判断会话秘钥与表属性中的加密秘钥是否一致,若一致则判定私有秘钥设置正确,执行步骤423;否则判定私有秘钥设置不正确,执行步骤424;
数据库客户端在通过数据库连接工具连接到数据库后,会建立会话,用户可在会话连接中通过命令行设置针对会话秘钥,例如通过如下命令行设置当前会话的employee表的会话秘钥为“abcd123”:
setencrypt.key.db_name.employee=“abcd123”
sql引擎通过读取当前会话中会话秘钥即可判断是否与表属性中加密秘钥属性的值一致,若一致则判定私有秘钥设置正确,否则判定秘钥设置错误。
步骤423.在获取到加密秘钥和加密算法后对加密列数据进行加密;
该步骤中,无论采用公共秘钥方式还是私有秘钥方式,在sql引擎获取到加密秘钥和加密算法后,即可对抽象语法树ast中的加密列对应的节点数据进行加密后替换原有节点的内容,这样就会在sql语句解析执行后,最终将加密后的列数据插入到表中。
步骤424.当会话秘钥设置错误时,向客户端返回异常错误信息,流程结束。
步骤431.在逻辑计划阶段生成和优化逻辑计划,在物理计划阶段生成和优化物理计划,然后执行物理计划;
步骤432.sql引擎将执行结果返回给客户端。
图5为本公开一实施例中查询sql语句的处理步骤流程图,详细说明如下:
步骤510.对接收到的sql语句进行解析,获取和绑定元数据;
还以前述员工employee表为例,在建employee表的时候通过在表属性中的encrypt.columns加密例属性指定加密列为name和password列。
接收到的查询sql语句示例如下:
select*fromemployee
sql引擎接收到sql语句进行词法和语法解析,在语法解析成功后,sql引擎会从元数据服务获取employee表的元数据并将所获取的元数据与employee表绑定,元数据中包括了employee表的表结构信息、表位置信息、表属性等。
步骤520.判断所述表的元数据中是否包括加密列属性,若包括则执行步骤521,否则执行步骤524;
在解析过程中获取到employee表的元数据后,通过元数据中表属性的加密列属性的值判断该表是否设置了加密列。
步骤521.通过表属性判断加密列的加密方式,若采用的是数据库级的公共秘钥则读取公共秘钥,然后执行步骤523;若采用的是表级别的私有秘钥,则执行步骤522;
在本公开一实施例中,默认采用公共秘钥方式,即在不设置加密秘钥属性或加密秘钥属性和加密类型属性的情况下,默认采用公共秘钥方式对加密列属性指定的列的数据进行加密,sql引擎直接从数据库获取公共秘钥或公共秘钥和加密算法,若表属性中未设置加密算法属性,则使用默认加密算法,否则使用所指定的加密算法。若设置了加密秘钥属性或设置了加密类型属性且加密类型属性指定为私有秘钥类型,则判定该表采用的是私有秘钥方式。
步骤522.当采用私有秘钥方式时,读取会话当中用户设置的会话秘钥,判断会话秘钥与表属性中的加密秘钥是否一致,若一致则判定私有秘钥设置正确,执行步骤523;否则判定私有秘钥设置不正确,执行步骤524;
数据库客户端在通过数据库连接工具连接到数据库后,会建立会话,用户可在会话连接中通过命令行设置针对会话秘钥,例如通过如下命令行设置当前会话的employee表的会话秘钥为“abcd123”:
setencrypt.key.db_name.employee=“abcd123”
sql引擎通过读取当前会话中会话秘钥即可判断是否与表属性中加密秘钥属性的值一致,若一致则判定私有秘钥设置正确,否则判定秘钥设置错误。
步骤523.设置需要解密的加密列索引;
该步骤中根据元数据中的加密列属性设置待解密的加密列索引,该步骤相当于设置了一个开关,用于控制是否需要在向客户端返回查询结果数据之前,对加密列的结果数据进行解密。在表属性中未包括加密列属性或私有秘钥方式情况下用户输入的会话秘钥与秘钥属性值不一致的情况下,加密列索引为空。
步骤524.在逻辑计划阶段生成和优化逻辑计划,在物理计划阶段生成和优化物理计划,然后执行物理计划;
步骤525.sql语句的物理执行计划执行完毕后,通过相应的数据库操作任务获得查询结果数据;
步骤526.判断加密列索引是否为空,若为空,则执行步骤528,否则执行步骤527;
步骤527.加密列索引不为空,说明表属性中设置了加密列属性,需要对加密列属性中指定的列的结果数据进行解密;
步骤528.将查询结果数据返回给客户端。
将加密列索引为空的情况下,加密列的结果数据将不会被解密,因此,返回给客户端的数据中加密列的数据为表中实际存储的未解密的数据。
需要说明的是,本公开技术方案在公共秘钥方式下兼容不支持本公开加密列功能的客户端的查询;在私有秘钥方式下,客户端为设置会话秘钥或会话秘钥设置错误时,返回的查询结果中加密列的数据由于是密文,因此会呈现乱码。
若本公开实施例中的表位于hive,基于本公开技术方案对hive的sql引擎进行改造后,hive将支持通过hive客户端针对具有的表的记录插入,对于不支持加密列的其它数据仓库/数据库的客户端,查询到的数据结果中加密列的数据为加密数据,从而保障了特定数据表的数据安全。
图6为本公开一实施例提供的一种实施本公开提供的方法的电子设备结构示意图,该设备600包括:诸如中央处理单元(cpu)的处理器610、通信总线620、通信接口640以及存储介质630。其中,处理器610与存储介质630可以通过通信总线620相互通信。存储介质630内存储有计算机程序,当该计算机程序被处理器610执行时即可实现本公开提供的方法的各步骤。
其中,存储介质可以包括随机存取存储器(randomaccessmemory,ram),也可以包括非易失性存储器(non-volatilememory,nvm),例如至少一个磁盘存储器。另外,存储介质还可以是至少一个位于远离前述处理器的存储装置。处理器可以是通用处理器,包括中央处理器(centralprocessingunit,cpu)、网络处理器(networkprocessor,np)等;还可以是数字信号处理器(digitalsignalprocessing,dsp)、专用集成电路(applicationspecificintegratedcircuit,asic)、现场可编程门阵列(field-programmablegatearray,fpga)或其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。
应当认识到,本公开的实施例可以由计算机硬件、硬件和软件的组合、或者通过存储在非暂时性存储器中的计算机指令来实现或实施。所述方法可以使用标准编程技术,包括配置有计算机程序的非暂时性存储介质在计算机程序中实现,其中如此配置的存储介质使得计算机以特定和预定义的方式操作。每个程序可以以高级过程或面向对象的编程语言来实现以与计算机系统通信。然而,若需要,该程序可以以汇编或机器语言实现。在任何情况下,该语言可以是编译或解释的语言。此外,为此目的该程序能够在编程的专用集成电路上运行。此外,可按任何合适的顺序来执行本公开描述的过程的操作,除非本公开另外指示或以其他方式明显地与上下文矛盾。本公开描述的过程(或变型和/或其组合)可在配置有可执行指令的一个或多个计算机系统的控制下执行,并且可作为共同地在一个或多个处理器上执行的代码(例如,可执行指令、一个或多个计算机程序或一个或多个应用)、由硬件或其组合来实现。所述计算机程序包括可由一个或多个处理器执行的多个指令。
进一步,所述方法可以在可操作地连接至合适的任何类型的计算平台中实现,包括但不限于个人电脑、迷你计算机、主框架、工作站、网络或分布式计算环境、单独的或集成的计算机平台、或者与带电粒子工具或其它成像装置通信等等。本公开的各方面可以以存储在非暂时性存储介质或设备上的机器可读代码来实现,无论是可移动的还是集成至计算平台,如硬盘、光学读取和/或写入存储介质、ram、rom等,使得其可由可编程计算机读取,当存储介质或设备由计算机读取时可用于配置和操作计算机以执行在此所描述的过程。此外,机器可读代码,或其部分可以通过有线或无线网络传输。当此类媒体包括结合微处理器或其他数据处理器实现上文所述步骤的指令或程序时,本公开所述的发明包括这些和其他不同类型的非暂时性计算机可读存储介质。当根据本公开所述的方法和技术编程时,本公开还包括计算机本身。
以上所述仅为本公开的实施例而已,并不用于限制本公开。对于本领域技术人员来说,本公开可以有各种更改和变化。凡在本公开的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本公开的保护范围之内。
1.一种实现列加密的方法,其特征在于,该方法应用于sql引擎,该方法包括:
接收客户端发送的sql语句;
当所述sql语句为创建表的sql语句时,所述sql语句中携带表属性,所述表属性中包括加密列属性,所述加密列属性用于指定所创建的表中需要加密的列,在解析和执行所述sql语句时,将所述表属性存储到元数据服务中;
当所述sql语句为插入记录的sql语句时,在解析所述sql语句的过程中,判断所述表的元数据中是否包括加密列属性;当判定包括加密列属性时,在生成逻辑计划之前使用预设的秘钥和预设加密算法对所述加密列属性中指定的列的数据进行加密;
当所述sql语句为查询记录的sql语句时,在解析所述sql语句的过程中,判断所述表的元数据中是否包括加密列属性;当判定包括加密列属性时,在sql引擎获取到查询结果后使用预设的秘钥和预设加密算法对所述加密列属性中指定的列的结果数据进行解密,再将查询结果返回给客户端。
2.根据权利要求1所述的方法,其特征在于,所述方法还包括:
在所述创建表的sql语句中携带的表属性中,除携带加密列属性外还携带有加密算法属性;所述预设的秘钥为数据库级的公共秘钥;所述预设加密算法为所述加密算法属性指定的加密算法。
3.根据权利要求1所述的方法,其特征在于,所述方法还包括:
在所述创建表的sql语句中携带的表属性中,除携带加密列属性外还携带加密算法属性和加密秘钥属性;
在所述接收客户端发送的sql语句之后,还包括获取会话中设置的会话秘钥的步骤;
当所述sql语句为插入记录的sql语句时,在生成逻辑计划之前,判断所述会话秘钥是否与元数据中的加密秘钥属性值一致,若一致则基于所述加密秘钥属性和所述加密算法属性对所述加密列属性中指定的列的数据进行加密;若不一致则终止所述sql语句的解析和执行,向客户端反馈错误信息;
当所述sql语句为查询记录的sql语句时,在sql引擎获取到查询结果后,在所述会话秘钥与元数据中的加密秘钥属性值一致的情况下,基于所述加密秘钥属性和所述加密算法属性对所述加密列属性中指定的列的结果数据进行解密;在所述会话秘钥与元数据中的加密秘钥属性值不一致的情况下,对所述加密列属性中指定的列的结果数据不进行解密。
4.根据权利要求2或3所述的方法,其特征在于,
所述表为hive数据仓库中的表,所述客户端为hive数据仓库的客户端;
当所述客户端为非hive数据仓库的客户端时,在不存在所述数据库级的公共秘钥或未获取到会话秘钥的情况下,在执行所述查询语句时,所获得的结果为表中实际存储的未解密的数据。
5.一种实现列加密的装置,其特征在于,该装置应用于sql引擎所在的设备,该装置包括:
通信模块,用于接收客户端发送的sql语句;以及将sql语句的执行结果返回给客户端;
引擎模块,用于解析和执行所述sql语句;所述引擎模块包括:
创建子模块,用于解析和执行创建表的sql语句;将所述创建表的sql语句中携带的表属性存储到元数据服务中;所述表属性中包括加密列属性,所述加密列属性用于指定所创建的表中需要加密的列;
插入子模块,用于解析和执行插入记录的sql语句;在解析所述sql语句的过程中,判断所述表的元数据中是否包括加密列属性;当判定包括加密列属性时,在生成逻辑计划之前使用预设的秘钥和预设加密算法对所述加密列属性中指定的列的数据进行加密;
查询子模块,用于解析和执行查询记录的sql语句;在解析所述sql语句的过程中,判断所述表的元数据中是否包括加密列属性;当判定包括加密列属性时,在获取到查询结果后使用预设的秘钥和预设加密算法对所述加密列属性中指定的列的结果数据进行解密,再将查询结果返回给客户端。
6.根据权利要求5所述的装置,其特征在于,
在所述创建表的sql语句中携带的表属性中,除携带加密列属性外还携带有加密算法属性;所述预设的秘钥为数据库级的公共秘钥;所述预设加密算法为所述加密算法属性指定的加密算法。
7.根据权利要求5所述的装置,其特征在于,
在所述创建表的sql语句中携带的表属性中,除携带加密列属性外还携带加密算法属性和加密秘钥属性;
所述通信模块还用于获取会话中设置的会话秘钥的步骤;
所述插入子模块还用于在生成逻辑计划之前,判断所述会话秘钥是否与元数据中的加密秘钥属性值一致,若一致则基于所述加密秘钥属性和所述加密算法属性对所述加密列属性中指定的列的数据进行加密;若不一致则终止所述sql语句的解析和执行,通过通信模块向客户端反馈错误信息;
所述查询子模块还用于在sql引擎获取到查询结果后,在所述会话秘钥与元数据中的加密秘钥属性值一致的情况下,基于所述加密秘钥属性和所述加密算法属性对所述加密列属性中指定的列的结果数据进行解密;在所述会话秘钥与元数据中的加密秘钥属性值不一致的情况下,对所述加密列属性中指定的列的结果数据不进行解密。
8.根据权利要求6或7所述的装置,其特征在于,
所述表为hive数据仓库中的表,所述客户端为hive数据仓库的客户端;
当所述客户端为非hive数据仓库的客户端时,在不存在所述数据库级的公共秘钥或未获取到会话秘钥的情况下,在所述查询子模块执行所述查询语句时,所获得的结果为表中实际存储的未解密的数据。
9.一种电子设备,其特征在于,包括处理器、通信接口、存储介质和通信总线,其中,处理器、通信接口、存储介质通过通信总线完成相互间的通信;
存储介质,用于存放计算机程序;
处理器,用于执行存储介质上所存放的计算机程序时,实施权利要求1-4任一项所述的方法步骤。
10.一种存储介质,其上存储有计算机程序,其特征在于,所述计算机程序当被处理器执行时实施如权利要求1至4中任一项所述的方法步骤。
技术总结