openGauss无感知加解密原理剖析
要实现在客户端进行加解密,无疑需要在客户端进行大量维护管理,包括数据密钥管理,敏感数据加密,解析和修改SQL语句等。openGauss将这一系列的复杂操作,全部封装在客户端加密驱动中,实现了完全自动化的敏感信息加密替换,同时在数据库中存储了所有加密相关的元信息,使得数据库可以很好的识别和处理对应的加密数据。同时SQL语句中的敏感信息相关的参数,也会被加密处理,保证查询任务不会泄露用户查询意图,减少客户端的复杂安全管理及操作难度,实现用户应用开发无感知。
另外,openGauss提供一系列的配置接口,满足用户对加密字段、加密算法、密钥安全存储等不同场景的需要。openGauss全密态数据库的透明性使得用户在任务迁移时将获得极大的便捷性。
对数据机密性及个人隐私最安全的保护就是加密,全密态技术能够在具体应用中对数据加解密,在数据库中完全以加密状态进行处理,以实现数据的全生命周期保护。然而,业界主流的应用端加解密技术,一般都涉及到密钥管理、算法选取、SQL语句变更、数据类型转换等大量操作。因此当业务需要对数据进行加密时,往往需要大量的适配迁移工作,而且容易因人为疏漏,导致风险。
而此次openGauss全密态推出无感知加密能力,核心是在客户端解析用户全部输入输出语句,识别出已定义的敏感数据,并且进行自动化的加解密。用户使用全密态数据库时,从输入语法,客户端发送到服务端,服务端执行并将结果返回给客户端的整个流程中,用户唯一能感知到的只有输入语法以及获得返回结果这两步。全密态数据库的技术核心分为几个模块,密钥管理、解析层、加解密驱动、隐式转换层、数据缓存等,全密态数据库的架构图如图1,这里我们主要介绍和用户无感知相关的几个模块。
图1 全密态数据库架构
1. 语法自动解析
在openGauss全密态数据库中,我们在客户端增加了一个轻量级的解析器,这个轻量级的解析器复用了服务端原有的解析器。用户输入语法后,如INSERT、SELECT等语法,客户端解析器进行词法和语法解析,获取到明文值及其位置,而加解密驱动则自动将明文替换为加密后的密文,然后将查询语句发送到服务端,此时在网络传输过程以及存储在数据库中的数据都是密文数据。在服务端将执行密文结果返回给客户端后,客户端加解密驱动自动将返回的密文数据进行解密并返回给用户。用户只能感知到输入的语法,获取到了明文的返回结果,对全程加密的整个流程并无具体的感知,而且语法和非密态数据的操作是完全相同的。
在升级后的openGauss全密态数据库中,客户端新增了对函数内语法的解析以及对函数特有的返回的Record数据的解密接口。在创建函数时,在解析层对函数主体的语法进行解析后,在函数处理器中通过加密驱动对函数主体中需要加密的值进行加密。而在执行函数时,在解析层解析完后,根据调用函数的形式,进入不同的处理器,通过加密驱动对需要加密的参数进行加密。这整个解析、加密的过程用户并不能感知到,整个流程都是全自动化的,不需要用户做其他的额外操作。
图2 密态等值查询支持函数和存储过程创建函数/过程方案
图3 密态等值查询支持函数和存储过程执行函数/过程方案
2. 数据隐式转换
对于数据库来说,加密列保存在数据库中是加密列类型,另外数据库中还保存着加密列的原始数据类型。但对于用户来说,显示给用户的数据类型是原始数据类型,虽然实际上保存在数据库中的密文是二进制形式,但其数据加解密及类型转换对于用户来说是无感知的。openGauss全密态数据库会判断返回的数据是否为加密类型,如果是加密类型,则调用加密驱动,根据原始数据类型对数据进行解密。
在升级后的openGauss全密态数据库中,用户在创建密态函数时,服务端在函数解析模块对参数类型进行校验,如果数据是加密类型,或者该列是加密列,则在优化模块对输入输出及返回参数进行转换,将函数的参数类型转换为加密列类型(二进制类型),并将函数参数的原始数据类型保存在数据库中。整个流程中的解析、加密、数据类型隐式转换对于用户时无感知的,用户甚至不需要对函数语法做任何修改。
图4 全密态数据库支持函数新增模块
3. 数据缓存
性能一直都是全密态数据库的一个挑战。openGauss全密态数据库中,数据库的主要性能损耗在密钥获取,密钥加解密,获取加密列信息,加解密数据上。如果执行语法的时候等待时间太久,用户的感知体验就会变差。因此我们通过数据缓存的模块,将客户端密钥信息,加密列信息缓存在客户端里。当用户初始化连接时会自动从数据库获取客户端主密钥路径,列加密密钥密文以及加密列信息等,而在使用的过程中,用户在第一次使用的时候会自动缓存密钥,当用户断开连接后,密钥及加密列信息会自动销毁。通过数据缓存,提升查询的性能,让用户不会感受到延迟。
4. 支持JDBC接口
考虑到任务在不同数据库迁移的问题,更多的用户会会更倾向于选择JDBC等统一访问接口的API。之前的openGauss仅支持gsql使用全加密数据库。在升级后的openGauss全密态数据库中,我们对JDBC进行了支持。JDBC客户端通过Java Native Interface(JNI)复用原有的加密驱动。通过对加密驱动进行改造,让它可以通过一套兼容libpq/JDBC的接口从服务端获取数据。用户调用JDBC的过程中实现跟gsql一样的加解密过程,用户在查询的过程中并不能感知到加密驱动中对数据的加解密。
图5 全密态等值查询支持JDBC新增模块
5. 支持国密算法
国密是国家密码局认定的国产密码算法,主要有SM1,SM2,SM3,SM4。SM1 对称加密,该算法不公开,不会支持。SM2为非对称加密,基于ECC。SM3 为消息摘要算法。SM4 为无线局域网标准的分组数据算法,即对称加密。在我国很多用户场景下都会使用到国密算法,为了给用户提供无感知迁移,扩展全密态数据库的适用场景,升级后的openGauss客户端主密钥CMK加密列加密密钥CEK时支持非对称加密算法SM2,通过CEK加解密用户数据的时候支持使用的对称加密算法SM4 加密和SM3消息摘要算法进行完整性校验。目前openGauss全密态数据库支持的算法如表1。
表1 全密态数据库支持加密算法
openGauss全密态数据库目前支持密态等值查询,提供了全密态技术中的纯软件方案,拥有着高安全、高性能的优势。未来将逐步开放更多的场景能力,如范围查询、模糊查询等,并且通过与TEE软硬融合方案,形成完整的密态查询与计算能力。在全密态数据库领域,openGauss会不断演进,为大家带来更安全、易用、高效的全密态数据库。
文章转自公众号:openGauss