[返回]
加脱密引擎
高品均 陈荣良
在数据库加密系统体系结构中,数据库加/脱密引擎位于应用程序与数据库服务器之间,是数据库加密系统的核心部件,负责在后台完成数据库信息的加/脱密处理,对应用开发人员和操作人员是透明的。
数据库加脱密引擎驻留在内存中,通过内部接口与加密字典管理程序和用户应用程序通讯,它没有自己的用户操作界面,在需要时由操作系统自动加载。
数据库加/脱密引擎由三大模块组成:
加脱密处理模块;
语法分析模块;
数据库接口模块。
数据库加密系统的结构如图所示:
数据库接口参数是应用系统访问数据库逻辑链路的标识,用户一旦成功登录到某个数据库服务器,即与之建立了一条逻辑链路,我们称之为 SQLLink。应用系统访问“加脱密处理模块”或者“加脱密处理模块”访问数据库都是通过接口参数SQLLink进行的。
在“加脱密处理模块”内部,系统通过接口参数DbedLink 相互调用。DbedLink有两种形式:其一是UserLink,用户访问“加脱密处理模块”时,即有与SQLLink对应的UserLink;其二是BackLink,“加脱密处理模块”在对数据库服务器进行某些操作时,为了不影响用户的数据库事务,没有借用原有的UserLink,而是另外复制了一条专用链路,即BackLink。
“加脱密处理模块”是数据库加脱密引擎的核心模块,包括数据库加脱密引擎的初始化、内部专用命令的处理、加密字典信息的检索、加密字典缓冲区的管理、SQL命令的加密变换、查询结果的脱密处理以及加脱密算法实现等功能子模块,另外还包括一些公用的辅助函数。
1.调用接口
“加脱密处理模块”被“数据库接口模块”调用时,参数是UserLink。“加脱密处理模块”将用户的SQL命令传递给“语法分析模块”,返回一棵二叉树,用于加脱密语义分析。“加脱密处理模块”在需要访问数据库时,则以UserLink 或BackLink参数调用“数据库接口模块”提供的数据库服务。
2.处理过程
对数据进行加/脱密的主要步骤如下:
对SQL命令进行语法分析,如果语法正确,转下一步,进行进一步处理;如果语法不正确,则转6,直接将SQL命令交数据库服务器处理。
是否为数据库加脱密引擎的内部控制命令?如果是,则处理内部控制命令,然后转7;如果不是,则转下一步。
检查数据库加脱密引擎是否处于关闭状态或SQL命令是否只需要编译?如果是,则转 6,否则转下一步。
检索加密字典,根据加密定义对SQL命令进行加脱密语义分析。
SQL命令是否需要加密处理?如果是,则将SQL命令进行加密变换,替换原SQL命令,然后转下一步;否则直接转下一步。
将SQL命令转送数据库服务器处理。
SQL命令执行完毕,清除SQL命令缓冲区。
3.加密字典缓冲区
加密字典缓冲区存放了最近访问的数据库表的字典信息,不加密的表虽然不存在与之对应的加密字典数据,但也登记在加密字典缓冲区中,便于系统快速判断一个表是否已加密。
加密字典缓冲区是私有的,各UserLink都有自己的加密字典缓冲区。此外,由于加密字典缓冲区位于客户端,有可能与服务器端的加密字典不一致,因此,应提供刷新加密字典缓冲区的操作接口。
4.其他问题
数据库的数据类型可以分为定长和变长类,定长类型的数据长度是确定的,不足定义长度的数据末尾将以空格(字符型)或零(二进制型)填满;变长类型的数据则按其实际长度存储。
用于存储加密的分组加密算法的分组长度一般为8位,多于一个分组数据的加密可以采用密文挪用法来处理最后可能出现的短块,而不必进行填充,以确保密文长度不扩展。但长度少于一个分组数据的加密通常用填充法处理,使密文长度扩大到8位。
“语法分析模块”的功能是将SQL命令转换成易处理的树形式。该模块由词法分析器、语法分析器、语法错误处理、语法树转换成SQL命令等子模块组成。
通常,“语法分析模块”只被“加脱密处理模块”调用,输入参数是SQL命令,输出参数是二叉树形式的分析结果,语法分析并不需要能识别所有类型的SQL命令,可以不考虑那些与加脱密无关的SQL命令,遇到不认识的SQL命令,则返回空语法树。
在进行语法分析时,“语法分析模块”先对SQL命令进行词法分析,分割成各个词法单位,再输入语法分析器,得到一棵语法树。
语法分析器用Unix操作系统提供的实用程序yacc生成, yacc能识别符合LALR文法的SQL命令。此外,“语法分析模块”还包括语法树反向生成SQL命令的功能函数,用于将经过加密变换的语法树转换成新的SQL命令。
“数据库接口模块”将所有访问数据库的操作封装在一起,屏蔽了各类数据库的特性,使得“加脱密处理模块”不必关心实际使用的是哪种数据库。该模块包含两部分接口:其一是前端数据库客户访问数据库加脱密引擎的接口函数;其二是数据库加脱密引擎访问后台数据库服务器的接口函数。
用户访问数据库加脱密引擎的入口点是“数据库接口模块”,用户通过SQLLink及SQL命令等参数调用“数据库接口模块”提供的用户接口函数,对于不同的数据库应用编程接口,用户接口函数的定义是不同的。
“数据库接口模块”以UserLink参数调用“加脱密处理模块”。“加脱密处理模块”在需要数据库服务时,以UserLink或BackLink参数调用“数据库接口模块”提供的通用数据库驱动函数。
“数据库接口模块”在接到“加脱密处理模块”的操作命令后,再负责通过SQLLink参数与后台的数据库服务器联系。
“数据库接口模块”的主要工作是接受用户的操作请求,并传递给“加脱密处理模块”,此外还要代替“加脱密处理模块”去访问数据库服务器,在这些过程中,需要完成外部数据库接口参数与数据库加脱密引擎内部数据结构之间的转换。