专利 全密态 索引

1 专利名称 一种基于可信执行环境的数据库密态索引访问方法、系统及介质 2 技术背景 全密态数据库:一种由数据库提供的安全特性,指数据库在处理数据的过程中,确保数据在传输、计算、存储等全生命周期阶段,于任何不可信的介质或环境中,始终处于加密状态。 全密态数据库实现方案:目前,业界较成熟的方案,是基于可信执行环境,实现全密态数据库,该方案主要分为2个模块:1)驱动加密:应用向数据库发送SQL语句时,应用侧的数据驱动自动加密SQL语句中的数据,数据库接收与处理数据密文。2)机密计算:数据库无法再密文上进行计算,将密文发送至可信执行环境(TEE)中,由可信模块完成解密与计算。 数据库索引结构:数据库中,最常见的索引为b+树索引。以tpcc测试模型为例,数据量低于100亿条时,b+树一般不超过4层。每一层的节点,即索引节点,是固定大小的page,分root index-page,internal index-page,leaf index-page。1个index-page中,存储多个index-item。其中,root和internal index-page中的index-item,存储数据和下一层index-page的位置。leaf index-page中的index-item,存储数据和table-page的位置。 加密性能:在加解密数据时,影响加密性能的因素中,加密次数的影响远高于数据长度。例如,1次加密8k数据,比40次加密200字节数据的性能高10+倍。 密态索引:在全密态数据库中,数据库只存储数据密文,在等值、范围查询等场景,为提高查询效率,避免全表扫描,需要在密文上构造索引。因此,需要见密文传输至可行执行环境TEE中,在TEE中临时解密数据,比较数据大小,构造索引。 现有方案缺陷:在构造密态索引时,现有方案存在以下缺陷:1)交互开销高:以索引元组为粒度,与TEE交互,交互次数多,交互开销高。2)加解密开销高:在索引页内比较元组大小时,需要多次解密索引元组。对于顶层的索引页,访问评率高,加解密频率也较高。3)内核修改多:为适配TEE,对索引构造、索引查询、并发控制等修改多,破坏生态兼容性等。 3 发明内容 发明目的:本发明针对在密文数据上构造索引、扫描索引的场景,提供一种通用的、高性能、低改造的方案,基于可信执行环境,大幅降低交互开销、加解密开销,并且,充分复用索引分裂、并发访问的机制,对内核侵入修改度低。 技术方案: 本发明的关键创新如下: 构造索引:应用插入数据时,驱动以字段为粒度,加密数据。数据库接收数据密文,TEE解密数据,构造索引,并以索引页为粒度,重新加密数据。 访问索引:结合索引的访问特点,每个index-item不独立加密与解密,每次以index-page为粒度加密与解密,降低加解密次数。 发送索引:数据库向TEE发生索引时,每次以index-page为粒度发送,降低交互次数。 缓存索引:在TEE中,针对索引中root和internal page访问频率高、修改频率低的特点,缓存解密后的page,降低解密次数、与TEE的交互次数。 内核改造:数据库中,访问索引时,只在需要比较大小时,才与TEE交互,保留已有索引分裂、并发访问机制。 以tpcc模型为例,当warhouse为10000时: 基表:bmsql_customer表中,数据行数为3亿,表大小约250G 索引:bmsql_customer主键索引中,index-item数为3亿,索引文件大小约9.5G,索引层数为4层,每层page数量分别:1、17、4400、114万,每个page中page-item数量约260个。插入1条数据,index-page平均分裂次数为0.0034次。 在该场景中,使用本发明的方案,考虑index-page分裂、TEE缓存偶尔未命中等所有可能产生额外交互、加密、解密的情况下: 场景 与TEE交互次数 加密次数(TEE内) 解密次数(TEE内) 插入1条数据 < 2.01 < 1.01 < 1.01 查询1条数据 < 2.01 0 < 1.01 删除1条数据 < 2.01 < 1.01 < 1.01 4 附图及附图的简单说明 4.1 密态索引结构 密态索引中,所有index-page中,只存储数据密文。在TEE中,以page为粒度加密,PageHeader、PageTail中,不存储用户数据,无需加密。 此处,以一个简单的3层索引为例,展示明文索引、密态索引的区别: 4.2 密态索引插入流程 在图1的示例中,向索引中插入1条数据,流程如下: 上述流程中,步骤12至20可通过缓存优化。以tpcc为例,index-item为3亿时,索引层数为4,索引文件大小约9.5G,root page数为1,internal page数为17+4000,缓存大小为31.38MB。 5 具体实施方式 5.1 创建密态索引 管理员:创建密钥 CREATE DATA KEY dk1(..); 数据库驱动:通过密钥服务或密码机生成密钥,缓存密钥,向数据库发送密钥信息 数据库:在系统表中,存储密钥信息,包括:密钥名、密钥Oid等。 管理员:创建加密表和索引:CREATE TABLE t1(c1 INT ENCRYPTED BY dk1, c2 TEXT),CREATE INDEX i1 ON t1(c1); 数据库:存储加密信息,包括:表名、列名、密钥名等。 5.2 向索引插入1条数据 前置条件:已创建密态索引 应用:连接数据库 数据驱动:连接数据库,查询加密信息、密钥信息,并缓存 数据库驱动:从密钥服务或密码机获取密钥,与可信执行环境建立安全通道,并传输密钥 可信执行环境:缓存密钥 应用:向数据库存储数据:INSERT INTO t1 VALUES (13, ‘data1’); 数据库驱动:对SQL进行语法解析,识别加密列字段,并加密字段,并改写SQL:INSERT INTO t1 VALUESS (cipher[13], ‘data1’); 数据库:向基表t1插入数据(cipher[13], ‘data1’),准备构造索引 数据库:向TEE中,发送密文 cipher[13] 可信执行环境:解密cipher[13],获取明文(13) 可信执行环境:查找缓存的root page,如果未找到,请求数据库发送root page,解密并缓存root page 可信执行环境:在root page中,二分查找,获取internal page位置 可信执行环境:查找缓存的internal page,如果未找到,请求数据库发送internal page,解密并缓存internal page 可信执行环境:在internal page中,二分查找,获取leaf page位置 可信执行环境:请求数据库发送leaf page。解密leaf page 可信执行环境:如果leaf page已满,触发分裂流程,此处不展开说明 可信执行环境:在leaf pag中,二分查找,获取插入位置 可信执行环境:在leaf page中,插入数据(13, 基表t1中13的存储位置) 可信执行环境:加密leaf page,向数据库返回加密后的leaf page 数据库:重新存储加密后的leaf page 5.3 从索引中查找1条数据 查询流程,与插入流程大部分一致: ...

July 15, 2026 · 1 min · 201 words · Me

高质量专项 全密态机密计算

目录 目录 1 架构 1.1 整体架构 2 流程 2.1 整体流程 3 设计 3.1 驱动加密 3.2 机密计算 一、技术调研 二、方案对比 4 接口 5 实现 1 架构 1.1 整体架构 全密态数据库是一种由数据库提供的安全特性,指数据库在处理数据的过程中,确保数据在传输、计算、存储等全生命周期阶段,于任何不可信的介质或环境中,始终处于加密状态。不可信环境包括:网络、内存、磁盘等。以常见的拓扑模型为例,在使用数据库的过程中,威胁面较广: 全密态数据库中,对于传输、存储安全,采用驱动加密方案。应用向数据库发送数据时,先在驱动中加密数据,再发送数据密文。应用从数据库接收数据时,先接收数据密文,再在驱动中解密数据。数据在网络、磁盘、服务端内存中,均处于加密状态。基本架构如下图所示: 全密态数据库中,对于计算安全,采用机密计算方案。驱动加密方案,解决传输、存储安全,但是,数据库端无法在密文上计算。为解决计算问题,业界有两种方案: 基于密码学算法的密文计算方案:通过密码学算法,让数据库在直接在密文上进行计算,例如保序加密、可搜索加密、同态加密等 基于硬件隔离的机密计算方案:在CPU、内存中,划分逻辑独立的可信执行环境,让数据库在可信执行环境中解密数据密文,进行计算。 在充分对比安全性、功能完备性、性能、实现难度等特点,选择机密计算方案。结合驱动加密方案、机密计算方案,全密态数据库整体架构如下图所示: 全密态数据库中,对于加密模型,采用多级密钥方案。数据由数据密钥加密,密钥由主密钥加密,主密钥由根密钥加密。在驱动加密模块中,只能获取数据密钥,无法获取主密钥。在更安全的加密方案中,驱动加密模块无法获取数据密钥,由硬件加密机加密。在数据库端,仅存储密钥信息,无法获取密钥。全密态数据库加密模型如下图所示: 2 流程 2.1 整体流程 使用全密态数据库时,用户需定义主密钥、数据密钥、加密表,在执行存储、查询数据时,全密态数据库自动完成加密、解密、计算等操作。完整的使用流程如图所示: 3 设计 3.1 驱动加密 3.2 机密计算 一、技术调研 纯软路线 同态加密 软硬路线 x86 cpu sgx:硬件 tdx:硬件 固件 me:出厂自带 软件 sgx driver amd cpu sev:Secure Encrypted Virtualization,CPU扩展电路,为每台虚拟机分配内存密钥,运行时加密整段内存。需BIOS开启。 sev-snp/sev-es 固件 psp 软件 kvm sev arm cpu trust-zone:每个核新增总线, 固件 arm trusted fimware 软件 op-tee tee: https://github.com/OP-TEE/build ...

January 19, 2026 · 1 min · 84 words · Me

数据库安全 传输加密

非国密 生成证书 数据库服务端:配置证书、配置传输加密算法 数据库客户端:配置证书 # 检查openssl版本 which openssl # 确保使用的是vastbase发布包中的openssl,而非操作系统中的openssl cp $GAUSSHOME/share/sslcert/gsql/openssl.cnf ./ export OPENSSL_CONF=`pwd`/openssl.cnf # 创建文件 mkdir cert cd cert mkdir ./demoCA ./demoCA/newcerts ./demoCA/private chmod 700 ./demoCA/private echo '01'>./demoCA/serial touch ./demoCA/index.txt # ca openssl genrsa -out ./demoCA/private/cakey.pem 2048 openssl req -new -key ./demoCA/private/cakey.pem -out ./demoCA/private/ca_cert_req.pem -subj "/C=CN/ST=Beijing/O=huawei/OU=gauss/CN=root" openssl x509 -req -in ./demoCA/private/ca_cert_req.pem -days 7300 -signkey ./demoCA/private/cakey.pem -out ./demoCA/cacert.pem # server openssl genrsa -out server.key 2048 openssl req -new -key server.key -out server.csr -subj "/C=CN/ST=Beijing/O=huawei/OU=gauss/CN=server" openssl x509 -req -in server.csr -days 3650 -CA ./demoCA/cacert.pem -CAkey ./demoCA/private/cakey.pem -CAcreateserial -out server.crt # client openssl genrsa -out client.key 2048 openssl req -new -key client.key -out client.csr -subj "/C=CN/ST=Beijing/O=huawei/OU=gauss/CN=client" openssl x509 -req -in client.csr -days 3650 -CA ./demoCA/cacert.pem -CAkey ./demoCA/private/cakey.pem -CAcreateserial -out client.crt # 查看内容 openssl x509 -in client.crt -text # 设置权限 chmod 600 client.key chmod 600 client.crt chmod 600 server.key chmod 600 server.crt chmod 600 ./demoCA/cacert.pem export CERT=`pwd` echo ' export CERT=`pwd` export PGSSLMODE=verify-ca export PGSSLROOTCERT=$CERT/demoCA/cacert.pem export PGSSLKEY=$CERT/client.key export PGSSLCERT=$CERT/client.crt ' > client_env source client_env # 设置服务端参数 gs_guc set -D $GAUSSHOME/data -c "ssl=on" gs_guc set -D $GAUSSHOME/data -c "ssl_ciphers = 'ALL'" gs_guc set -D $GAUSSHOME/data -c "ssl_ca_file = '$CERT/demoCA/cacert.pem'" gs_guc set -D $GAUSSHOME/data -c "ssl_key_file='$CERT/server.key'" gs_guc set -D $GAUSSHOME/data -c "ssl_cert_file='$CERT/server.crt'" # 重启数据库 vsql -d postgres -c " CREATE USER u1 PASSWORD 'u1.password' " # 连接数据库:需加-h参数 vsql -h localhost -d postgres -U u1 -W 'u1.password' -r rm -f client.* server.* gs_guc set -D $GAUSSHOME/data -c "ssl_ciphers = 'ECDHE-ECDSA-SM4-CBC-SM3'" openssl ecparam -name SM2 -genkey -out ./demoCA/private/cakey.pem openssl req -new -key ./demoCA/private/cakey.pem -out ./demoCA/private/ca_cert_req.pem -subj "/C=CN/ST=Beijing/O=huawei/OU=gauss/CN=root" openssl x509 -req -in ./demoCA/private/ca_cert_req.pem -days 7300 -signkey ./demoCA/private/cakey.pem -out ./demoCA/cacert.pem # server openssl ecparam -name SM2 -genkey -out server.key openssl req -new -key server.key -out server.csr -subj "/C=CN/ST=Beijing/O=huawei/OU=gauss/CN=server" openssl x509 -req -in server.csr -days 3650 -CA ./demoCA/cacert.pem -CAkey ./demoCA/private/cakey.pem -CAcreateserial -out server.crt # client openssl ecparam -name SM2 -genkey -out client.key openssl req -new -key client.key -out client.csr -subj "/C=CN/ST=Beijing/O=huawei/OU=gauss/CN=client" openssl x509 -req -in client.csr -days 3650 -CA ./demoCA/cacert.pem -CAkey ./demoCA/private/cakey.pem -CAcreateserial -out client.crt chmod 600 client.key client.crt server.key server.crt ./demoCA/cacert.pem openssl x509 -in client.crt -text 国密 mkdir cert cd cert openssl version # OpenSSL 1.1.1s Tassl 2.1.2 1 Nov 2022 cp ../tassl/install/openssl.cnf ./ chmod +w ./openssl.cnf echo ' [ gm_ca_cert ] subjectKeyIdentifier=hash authorityKeyIdentifier=keyid:always,issuer basicConstraints = critical,CA:true keyUsage = critical, cRLSign, keyCertSign [ gm_sign_cert ] basicConstraints = CA:FALSE keyUsage = critical, digitalSignature, nonRepudiation [ gm_enc_cert ] basicConstraints = CA:FALSE keyUsage = critical, keyEncipherment, dataEncipherment, keyAgreement' >> ./openssl.cnf mkdir ./demoCA ./demoCA/newcerts ./demoCA/private chmod 700 ./demoCA/private echo '01'>./demoCA/serial touch ./demoCA/index.txt # ca openssl ecparam -name SM2 -genkey -out ./demoCA/private/cakey.pem openssl req -config openssl.cnf -new -key ./demoCA/private/cakey.pem -sm3 -out ./demoCA/private/ca_cert_req.pem -subj "/C=CN/ST=Beijing/O=huawei/OU=gauss/CN=root" openssl x509 -req -extfile openssl.cnf -extensions gm_ca_cert -in ./demoCA/private/ca_cert_req.pem -sm3 -days 7300 -signkey ./demoCA/private/cakey.pem -out ./demoCA/cacert.pem # server openssl ecparam -name SM2 -genkey -out server.key openssl ec -in server.key -passout pass:gauss@123 -sm4 -out server.key openssl req -config openssl.cnf -new -key server.key -passin pass:gauss@123 -sm3 -out server.csr -subj "/C=CN/ST=Beijing/O=huawei/OU=gauss/CN=server" openssl x509 -req -extfile openssl.cnf -extensions gm_sign_cert -in server.csr -sm3 -days 3650 -CA ./demoCA/cacert.pem -CAkey ./demoCA/private/cakey.pem -passin pass:gauss@123 -CAcreateserial -out server.crt # server.enc openssl ecparam -name SM2 -genkey -out server_enc.key openssl ec -in server_enc.key -passout pass:gauss@123 -sm4 -out server_enc.key openssl req -config openssl.cnf -new -key server_enc.key -passin pass:gauss@123 -sm3 -out server_enc.csr -subj "/C=CN/ST=Beijing/O=huawei/OU=gauss/CN=server" openssl x509 -req -extfile openssl.cnf -extensions gm_enc_cert -in server_enc.csr -sm3 -days 3650 -CA ./demoCA/cacert.pem -CAkey ./demoCA/private/cakey.pem -passin pass:gauss@123 -CAcreateserial -out server_enc.crt gs_guc encrypt -M server -D ./ -K gauss@123 # client openssl ecparam -name SM2 -genkey -out client.key openssl ec -in client.key -passout pass:gauss@123 -sm4 -out client.key openssl req -config openssl.cnf -new -key client.key -passin pass:gauss@123 -sm3 -out client.csr -subj "/C=CN/ST=Beijing/O=huawei/OU=gauss/CN=client" openssl x509 -req -extfile openssl.cnf -extensions gm_sign_cert -in client.csr -sm3 -days 3650 -CA ./demoCA/cacert.pem -CAkey ./demoCA/private/cakey.pem -passin pass:gauss@123 -CAcreateserial -out client.crt # client.enc openssl ecparam -name SM2 -genkey -out client_enc.key openssl ec -in client_enc.key -passout pass:gauss@123 -sm4 -out client_enc.key openssl req -config openssl.cnf -new -key client_enc.key -passin pass:gauss@123 -sm3 -out client_enc.csr -subj "/C=CN/ST=Beijing/O=huawei/OU=gauss/CN=client" openssl x509 -req -extfile openssl.cnf -extensions gm_enc_cert -in client_enc.csr -sm3 -days 3650 -CA ./demoCA/cacert.pem -CAkey ./demoCA/private/cakey.pem -passin pass:gauss@123 -CAcreateserial -out client_enc.crt gs_guc encrypt -M client -D ./ -K gauss@123 # openssl x509 -in client.crt -text export CERT=`pwd` echo ' export CERT=`pwd` export PGSSLMODE=verify-ca export PGSSLTLCP=1 export PGSSLROOTCERT=$CERT/demoCA/cacert.pem export PGSSLKEY=$CERT/client.key export PGSSLCERT=$CERT/client.crt export PGSSLENCKEY=$CERT/client_enc.key export PGSSLENCCERT=$CERT/client_enc.crt ' > client_env source client_env # 设置服务端参数 gs_guc set -D $GAUSSHOME/data/single_node -c "ssl=on" gs_guc set -D $GAUSSHOME/data/single_node -c "ssl_ciphers = 'ALL'" gs_guc set -D $GAUSSHOME/data/single_node -c "ssl_use_tlcp=on" gs_guc set -D $GAUSSHOME/data/single_node -c "ssl_ca_file = '$CERT/demoCA/cacert.pem'" gs_guc set -D $GAUSSHOME/data/single_node -c "ssl_key_file='$CERT/server.key'" gs_guc set -D $GAUSSHOME/data/single_node -c "ssl_cert_file='$CERT/server.crt'" gs_guc set -D $GAUSSHOME/data/single_node -c "ssl_enc_key_file='$CERT/server_enc.key'" gs_guc set -D $GAUSSHOME/data/single_node -c "ssl_enc_cert_file='$CERT/server_enc.crt'" # 重启数据库

May 21, 2025 · 4 min · 762 words · Me

数据库安全 全密态

PQconnectStart makeEmptyPGconn connectOptions1 parse_connection_string fillPGconn conninfo_getval("enable_ce") # 解析 'enable_ce' connectDBStart PQconnectPoll if CONNECTION_NEEDED: # 建立TCP连接 connect elif CONNECTION_MADE: # 发送连接参数 pqBuildStartupPacket3 build_startup_packet pqPacketSend elif CONNECTION_AWAITING_RESPONSE # 进行身份认证 pg_fe_sendauth PQexec PQexecStart PQsendQuery Processor::run_pre_query # 加密SQL语句中的数据 Parser::Parse run_pre_statement run_pre_insert_statement CachedColumnManager::get_cached_columns RawValues::get_raw_values_from_insert_statement ValuesProcessor::process_values process_inside_value # 加密 StatementData::replace_raw_values pqPutMsgStart pqPuts pqPutMsgEnd pqFlush PQexecFinish PQgetResult parseInput pqParseInput3 pqGetc pqGetInt case 'D' getAnotherTuple pqRowProcessor ValuesProcessor::deprocess_value # 解密服务端返回的数据 pqGets case 'Z' Processor::run_post_query pqReadData

May 20, 2025 · 1 min · 66 words · Me

vastbase 加密函数

1 需求背景 1.1 数据加密背景 加密的原理 不同场景中,适合的加密算法类型不同。对存储数据加密,通常采用对称密码算法,此处主要介绍对称密码算法: 加密原理:输入1个明文,输入1个密钥,对明文和密钥进行一些运算(比如异或,代换),可得到1个密文。密钥通常是随机生成的。 加密算法:DES算法,发布于1977年,已确定为不安全加密算法。3DES算法,调用3次DES算法,生成3个密钥,安全性与DES差别不大,也属于不安全的加密算法。AES算法,发布于2001年,通用的国际标准 数据库加密函数 几乎所有数据库,都提供内置加密函数,让用户通过SQL语句调用。最典型的场景如下: -- 假设,数据库提供函数encrypt(明文,密钥,加密算法),输出为密文 -- 用户想表't1'中存储数据'shenkun',则存储的语法如下:(用户自己保管密钥) INSERT INTO t1 VALUES (encrypt('shenkun', '一串随机的密钥', 'aes')); 1.2 oracle 加密包 早期版本的oracle中,包含1个名为dbms_obfuscation_toolkit的包,提供7个函数,主要实现加密、解密等功能: 版本信息:oracle 8i版本开始提供,oracle 10g版本开始不被推荐使用,由dbms_crypto代替,oracle 21c版本正式移除 函数列表: 生成随机数:desgetkey(seed) -> key 加密:desencrypt(input, key) -> encrypted_data 解密:descdecrypt(input, key) -> decrypted_data 生成随机数:des3getkey(which=>0, seed) -> key 加密:des3encrypt(input, key, which=>0, iv=>012345678abcdef) -> encrypted_data 解密:des3decrypt(input, key, which=>0, iv=>012345678abcdef) -> decrypted_data 哈希:md5(input) -> checksum 函数参数:函数参数有3种数据类型:varchar2, raw。与raw类型相比,如果是varchar2类型,参数名需加上_string后缀。比如,raw类型的入参名为input,则varcha2类型入参名为input_string 函数限制: desgetkey:seed长度最短为80字节 desencrypt:input长度是8字节的整数倍;key最短为8字节,超过8字节的部分被丢弃 descdecrypt:input长度是8字节的整数倍;key最短为8字节,超过8字节的部分被丢弃 des3getkey: seed长度最短为80字节 des3encrypt:input长度是8字节的整数倍;which为0时,key最短为16字节,超过16字节的部分被丢弃;which为1时,key最短为24字节,超过24字节的部分被丢弃 des3dencrypt:input长度是8字节的整数倍;which为0时,key最短为16字节,超过16字节的部分被丢弃;which为1时,key最短为24字节,超过24字节的部分被丢弃 md5:无 参考文档 函数介绍:函数背景、注意事项等:https://docs.oracle.com/cd/A97630_01/appdev.920/a96590/adgsec04.htm 函数参数:参数类型、调用示例等:https://docs.oracle.com/cd/B10500_01/appdev.920/a96612/d_obtoo2.htm 以下是上述函数的调用示例: ...

February 9, 2025 · 6 min · 1095 words · Me

海量 透明加密 设计

1 透明加密 1.1 功能简述 关于透明加密的基本概念,请看需求文档。 用户使用透明加密的示例如下: CREATE TABLE t1 (c1 TEXT, c2 TEXT); CREATE ENCRYPTION KEY tde_key WITH (source=local, password='pass.123'); CREATE ENCRYPTION POLICY ep1 FRO t1 KEY tde_key; INSERT INTO t1 VALUES ('data1', 'data2'); INSERT INTO t1 VALUES ('data1', 'data2'); SELECT * FROM t1; 1.2 实现方案 1.2.1 整体架构 透明加密的核心目标,是通过数据加密方案,解决攻击者绕过数据库安全机制,直接从磁盘窃取数据的问题。 在加密数据后,需要确保不影响内核在数据上进行计算。因此,需要在存储层底层,对数据进行加密。另外,为确保存储底层能够识别哪些数据加密,哪些数据不加密,以及使用什么算法加密等,上层需传递加密信息。透明加密逻辑架构如下: 1.2.2 工作流程 为适配存储底层设计,同时兼顾加密性能,以Page为粒度进行加密,并且,在Page中,存储加密信息。 1.2.3 详细流程 一、启动进程 在启动进程阶段,故障恢复时,如果回放到属于加密表的xlog,涉及到解密Page,因此,需在故障恢复前加载密钥。 main # 1. 启动数据库进程(基于pg-16代码) PostmasterMain # 2. 启动postmaster进程 SelectConfigFiles # 3. 读取GUC文件 'tde_load_encryption_key' # 4. 读取密钥文件(后文介绍密钥如何生成) SysLogger_Start StartupDataBase # 5. 开始故障恢复 StartupProcessMain StartupXLOG ReadControlFile PerformWalRecovery for loop: ReadRecord # 6. 读取xlog ApplyWalRecord # 7. 重放xlog GetRmgr.rm_redo ... heap_xlog_insert XLogReadBufferForRedo XLogReadBufferForRedoExtended XLogReadBufferExtended ReadBufferWithoutRelcache ReadBuffer_common smgrread # 8. 读取数据文件 # 需解密,后文统一介绍 ServerLoop for loop: ConnCreate BackendStartup BackendRun PostgresMain # 9. 启动postgres进程 StartCheckpointer StartBackgroundWriter StartChildProcess AuxiliaryProcessMain BackgroundWriterMain # 10. 启动bgwriter进程 二、生成密钥 当前版本,所有表,使用同一个数据密钥。因此,暂时无需新增系统表,存储密钥对象。 ...

March 23, 2026 · 3 min · 545 words · Me

海量 透明加密 需求

1 简介 1.1 目的 透明加密特性提供数据加密功能,核心原理是在数据库将数据存储至磁盘时,先加密再存储。 本需求将从0设计透明加密特性,在保障功能、性能、易用性、可用性、可维护性、可扩展性等的前提下,让特性达到商用标准。 1.2 适用范围 Vastbase V5版本。 1.3 术语定义、首字母缩写词和缩略语 TDE:Transparent Data Encryption,透明数据加密,由数据库提供的数据加密特性 1.4 参考资料 oracle 透明加密特性:https://docs.oracle.com/en/database/oracle/oracle-database/26/dbtde/preface.html sql server 透明加密特性:https://learn.microsoft.com/en-us/sql/relational-databases/security/encryption/transparent-data-encryption?view=sql-server-ver17 oceanbase 透明加密特性:https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000004475958 kingbase 透明加密特性:https://docs.kingbase.com.cn/cn/KES-V9R1C10/safe/transparent-data-Encyption dm8 透明加密特性:https://eco.dameng.com/document/dm/zh-cn/pm/storage-encryption.html#7.1.1%20%E5%85%A8%E5%BA%93%E5%8A%A0%E5%AF%86 gaussdb 透明加密特性:https://support.huaweicloud.com/intl/zh-cn/fg-gaussdb-dist-v8/gaussdb-18-0019.html 2 透明加密 2.1 功能简述 一、基本原理 通常,用户将数据传输给数据库后,数据库将数据存储到磁盘。攻击者可能利用多种数据库内部或外部漏洞,例如操作系统漏洞等,绕过数据库安全机制,直接从磁盘读取数文件,窃取用户数据。 透明加密,是一种由数据库提供的加密特性,可有效解决攻击者从磁盘窃取数据的问题。开启透明加密后,数据库将数据存储到磁盘时,先加密数据,再存储数据密文;数据库从磁盘读取数据时,先解密数据密文,再进行其他计算。用户访问透明加密表时,包括存储、读取数据等,与访问普通表无任何区别,加密和解密过程由数据库自动完成,即对用户透明。 二、竞品分析 几乎所有商用关系数据库中,都支持透明加密特性,包括oracle, sql server, oceanbase, kingbase, dm8等,postgresql不支持透明加密特性。 使用透明加密时,通常包括3个阶段: 定义用于加密的密钥 使用SQL语法,定义哪些对象需加密,不同产品,定义加密对象的粒度不同 使用SQL语法,访问透明加密表,以及进行其他运维等操作 各产品中,定义加密对象的SQL语法如下: -- 一、oracle CREATE TABLE t1(c1 INT, c2 TEXT ENCRYPT); CREATE TABLESPACE ts1 DATAFILE .. ENCRYPTION USING 'AES192' ENCRYPT; -- 二、sql server CREATE DATABASE ENCRYPTION KEY WITH ALGORITHM = AES_256 .. ALTER DATABASE db1 SET ENCRYPTION ON; -- 三、oceanbase CREATE TABLESPACE ts1 encryption = 'y'; -- mysql cmpt CREATE TABLESPACE ts1 ENCRYPTION USING 'aes-256'; -- oracle cmpt -- 四、kingbase CREATE TABLESPACE ts .. WITH (ENCRYPTION = TRUE); CREATE TABLE ts .. ENCRYPTED BY 'this is a key'; -- 五、dm8 intdb .. ENCRYPT_NAME .. CREATE TABLESPACE .. ENCRYPT WITH .. CREATE TABLE t1 (c1 INT, c2 INT ENCRYPT WITH ..); -- 六、gaussdb CREATE TABLE t1 .. WITH (enable_tde=on); 各产品中,按定义加密对象的粒度,区别如下: ...

March 20, 2026 · 5 min · 916 words · Me
心情不好的时候可以点一下 🐱
×
🤖 Doubao AI ×
Hi! 我是你的技术助手。关于代码、架构或 Bug,随时问我!🚀