---
title: 全密态黑科技再升级，无感知加解密原理剖析-官方技术文章-鲲鹏社区
description: 本文主要介绍openGauss和用户无感知的几项功能，包括语法自动解析、数据隐式转换、 数据缓存等。
keywords: 全密态黑科技再升级,无感知加解密原理剖析,官方技术文章,鲲鹏社区,语法自动解析,数据隐式转换,数据缓存,JDBC
url: https://www.hikunpeng.com/developer/techArticles/20230913-5?envFlag=1
section: (其他)
---

# 全密态黑科技再升级，无感知加解密原理剖析-官方技术文章-鲲鹏社区

URL: https://www.hikunpeng.com/developer/techArticles/20230913-5?envFlag=1
描述: 本文主要介绍openGauss和用户无感知的几项功能，包括语法自动解析、数据隐式转换、 数据缓存等。
关键词: 全密态黑科技再升级,无感知加解密原理剖析,官方技术文章,鲲鹏社区,语法自动解析,数据隐式转换,数据缓存,JDBC

官方技术文章 [了解详情](https://www.hikunpeng.com/zh/developer/techArticles)

全密态黑科技再升级，无感知加解密原理剖析

全密态黑科技再升级，无感知加解密原理剖析

实战经验

发表于 2021/10/13

0

要实现在客户端进行加解密,无疑需要在客户端进行大量维护管理,包括数据密钥管理,敏感数据加密,解析和修改SQL语句等。openGauss将这一系列的复杂操作,全部封装在客户端加密驱动中,实现了完全自动化的敏感信息加密替换,同时在数据库中存储了所有加密相关的元信息,使得数据库可以很好的识别和处理对应的加密数据。同时SQL语句中的敏感信息相关的参数，也会被加密处理,保证查询任务不会泄露用户查询意图,减少客户端的复杂安全管理及操作难度,实现用户应用开发无感知。

另外,openGauss提供一系列的配置接口,满足用户对加密字段、加密算法、密钥安全存储等不同场景的需要。openGauss全密态数据库的透明性使得用户在任务迁移时将获得极大的便捷性。

对数据机密性及个人隐私最安全的保护就是加密，全密态技术能够在具体应用中对数据加解密，在数据库中完全以加密状态进行处理，以实现数据的全生命周期保护。然而，业界主流的应用端加解密技术，一般都涉及到密钥管理、算法选取、SQL语句变更、数据类型转换等大量操作。因此当业务需要对数据进行加密时，往往需要大量的适配迁移工作，而且容易因人为疏漏，导致风险。

而此次openGauss全密态推出无感知加密能力，核心是在客户端解析用户全部输入输出语句，识别出已定义的敏感数据，并且进行自动化的加解密。用户使用全密态数据库时，从输入语法，客户端到服务端，服务端执行并将结果返回给客户端的整个流程中，用户唯一能感知到的只有输入语法以及获得返回结果这两步。全密态数据库的技术核心分为几个模块，密钥管理、解析层、加解密驱动、隐式转换层、数据缓存等，全密态数据库的架构图如图1，这里我们主要介绍和用户无感知相关的几个模块。

图1 全密态数据库架构

## 语法自动解析

在openGauss全密态数据库中，我们在客户端增加了一个轻量级的解析器，这个轻量级的解析器复用了服务端原有的解析器。用户输入语法后，如INSERT、SELECT等语法，客户端解析器进行词法和语法解析，获取到明文值及其位置，而加解密驱动则自动将明文替换为加密后的密文，然后将查询语句到服务端，此时在网络传输过程以及存储在数据库中的数据都是密文数据。在服务端将执行密文结果返回给客户端后，客户端加解密驱动自动将返回的密文数据进行解密并返回给用户。用户只能感知到输入的语法，获取到了明文的返回结果，对全程加密的整个流程并无具体的感知，而且语法和非密态数据的操作是完全相同的。

在升级后的openGauss全密态数据库中，客户端新增了对函数内语法的解析以及对函数特有的返回的Record数据的解密接口。在创建函数时，在解析层对函数主体的语法进行解析后，在函数处理器中通过加密驱动对函数主体中需要加密的值进行加密。而在执行函数时，在解析层解析完后，根据调用函数的形式，进入不同的处理器，通过加密驱动对需要加密的参数进行加密。这整个解析、加密的过程用户并不能感知到，整个流程都是全自动化的，不需要用户做其他的额外操作。

图2 密态等值查询支持函数和存储过程创建函数/过程方案

图3 密态等值查询支持函数和存储过程执行函数/过程方案

## 数据隐式转换

对于数据库来说，加密列保存在数据库中是加密列类型，另外数据库中还保存着加密列的原始数据类型。但对于用户来说，显示给用户的数据类型是原始数据类型，虽然实际上保存在数据库中的密文是二进制形式，但其数据加解密及类型转换对于用户来说是无感知的。openGauss全密态数据库会判断返回的数据是否为加密类型，如果是加密类型，则调用加密驱动，根据原始数据类型对数据进行解密。

在升级后的openGauss全密态数据库中，用户在创建密态函数时，服务端在函数解析模块对参数类型进行校验，如果数据是加密类型，或者该列是加密列，则在优化模块对输入输出及返回参数进行转换，将函数的参数类型转换为加密列类型（二进制类型），并将函数参数的原始数据类型保存在数据库中。整个流程中的解析、加密、数据类型隐式转换对于用户时无感知的，用户甚至不需要对函数语法做任何修改。

图4 全密态数据库支持函数新增模块

## 数据缓存

性能一直都是全密态数据库的一个挑战。openGauss全密态数据库中，数据库的主要性能损耗在密钥获取，密钥加解密，获取加密列信息，加解密数据上。如果执行语法的时候等待时间太久，用户的感知体验就会变差。因此我们通过数据缓存的模块，将客户端密钥信息，加密列信息缓存在客户端里。当用户初始化连接时会自动从数据库获取客户端主密钥路径，列加密密钥密文以及加密列信息等，而在使用的过程中，用户在第一次使用的时候会自动缓存密钥，当用户断开连接后，密钥及加密列信息会自动销毁。通过数据缓存，提升查询的性能，让用户不会感受到延迟。

## 支持JDBC接口

考虑到任务在不同数据库迁移的问题，更多的用户会会更倾向于选择JDBC等统一访问接口的API。之前的openGauss仅支持gsql使用全加密数据库。在升级后的openGauss全密态数据库中，我们对JDBC进行了支持。JDBC客户端通过Java Native Interface(JNI)复用原有的加密驱动。通过对加密驱动进行改造，让它可以通过一套兼容libpq/JDBC的接口从服务端获取数据。用户调用JDBC的过程中实现跟gsql一样的加解密过程，用户在查询的过程中并不能感知到加密驱动中对数据的加解密。

图5 全密态等值查询支持JDBC新增模块

## 支持国密算法

国密是国家密码局认定的国产密码算法，主要有SM1，SM2，SM3，SM4。SM1 对称加密，该算法不公开，不会支持。SM2为非对称加密，基于ECC。SM3 为消息摘要算法。SM4 为无线局域网标准的分组数据算法，即对称加密。在我国很多用户场景下都会使用到国密算法，为了给用户提供无感知迁移，扩展全密态数据库的适用场景，升级后的openGauss客户端主密钥CMK加密列加密密钥CEK时支持非对称加密算法SM2，通过CEK加解密用户数据的时候支持使用的对称加密算法SM4 加密和SM3消息摘要算法进行完整性校验。目前openGauss全密态数据库支持的算法如表1。

表1 全密态数据库支持加密算法

| 全密态数据库 | KeyStore | 密钥加密算法 | 加密数据算法 |
| --- | --- | --- | ---|
| openGauss | localkms | RSA_2048 | AEAD_AES_256_CBC_HMAC_SHA_256 |
| AEAD_AES_128_CBC_HMAC_SHA_256 |  |  |  |
| SM2 | SM4_SM3 |  |  |

openGauss全密态数据库目前支持密态等值查询，提供了全密态技术中的纯软件方案，拥有着高安全、高性能的优势。未来将逐步开放更多的场景能力，如范围查询、模糊查询等，并且通过与TEE软硬融合方案，形成完整的密态查询与计算能力。在全密态数据库领域，openGauss会不断演进，为大家带来更安全、易用、高效的全密态数据库。

相关推荐：

Ustore在openGauss闪亮登场，重构openGauss数据存储的灵魂 [了解详情](https://www.hikunpeng.com/zh/developer/techArticles/20230913-4?envFlag=1)

深度干货！openGauss日志共识框架大揭秘 [了解详情](https://www.hikunpeng.com/zh/developer/techArticles/20230913-2?envFlag=1)

DB4AI：使能数据库原生AI计算，助力数据湖场景业务成功 [了解详情](https://www.hikunpeng.com/zh/developer/techArticles/20230913-1?envFlag=1)

解密openGauss DB4AI框架的内部机理 [了解详情](https://www.hikunpeng.com/zh/developer/techArticles/20230912-19?envFlag=1)

本页内容
