HomSQL 是一个基于 HE3DB 的同态数据查询原型系统,目标是让客户端负责输入 SQL 与本地加解密,而服务端在尽量不接触明文的前提下完成查询计算。
当前项目聚焦于隐私保护查询场景,主要覆盖两类业务方向:
- 明密联合查询
- 密密外包查询
理想流程如下:
- 客户端准备查询语句与本地密钥材料。
- 通过 APSI 完成交集发现或 join 前置处理。
- 服务端在合表结果上执行
SELECT与条件过滤等计算。 - 客户端接收结果并完成解密。
目前已经完成的部分:
- 明密查询场景下的
SELECT - 明密查询场景下的
INNER JOIN
当前实现思路:
- 先利用 APSI 完成
INNER JOIN所需的交集处理。 - 再在合表结果上执行
SELECT列选择或表达式计算。 - 最后通过
WHERE条件过滤目标行。
- 支持选择单列
- 支持表达式查询
- 表达式支持明密混合的加、减、乘运算
- 支持括号表达式
更细的语法约束可参考 test/select_test.cpp 中的注释与示例。
- 使用 APSI 处理 join 前的交集相关流程
- 服务端基于交集结果执行后续合表逻辑
更详细的设计说明可参考 test/inner_join_test_server.cpp 中的注释。
当前测试实现里,客户端会直接把明文交集发送给服务端,因此这一部分仍然是原型验证阶段,而不是完整的隐私保护实现。
- C++20
- CMake 3.16+
- OpenMP
- HE3DB
- TFHEpp
- Microsoft SEAL
- APSI 相关测试组件
根据仓库中的 Dockerfile,当前开发环境主要基于 Ubuntu 22.04,常见依赖包括:
g++-10cmakelibgmp-devnlohmann-json3-devlibboost-all-devopenssh-server
mkdir -p build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=g++-10 -DSEAL_THROW_ON_TRANSPARENT_CIPHERTEXT=OFF
cmake --build . -j4编译完成后,默认产物会输出到:
build/binbuild/lib
项目运行时使用 src/HomSQL/common/config.txt 管理路径、数据文件、通信地址和表前缀等参数。
如果你要在本地运行测试,通常需要先检查这些内容是否与当前机器环境一致:
- 数据文件路径
- 密文输出目录
- SSH 私钥路径
- 客户端与服务端地址
当前测试目标由 test/CMakeLists.txt 注册。
单端测试可直接运行对应可执行文件;涉及客户端与服务端交互的测试,需要分别打开两个终端,先运行服务端,再运行客户端。
常见测试目标如下:
| 测试目标 | 说明 |
|---|---|
select_test | SELECT 功能验证 |
ckks_test | CKKS 基础使用说明与验证 |
ckks_test_server / ckks_test_client | 双端加密查询流程测试 |
cli_test_server / cli_test_client | APSI 客户端/服务端测试 |
inner_join_test_server / inner_join_test_client | 明密 INNER JOIN 原型测试 |
.
├─ src/ # HomSQL 核心源码
│ └─ HomSQL/
│ ├─ client/ # 客户端逻辑、密钥与查询预处理
│ ├─ server/ # 服务端 SQL 解析与计算
│ ├─ common/ # 配置与公共参数
│ └─ utils/ # 加密、文件与网络工具
├─ test/ # 测试代码、样例数据与参数
├─ thirdparty/ # 第三方依赖
├─ CMakeLists.txt # 顶层构建入口
└─ Dockerfile # 容器化构建环境
apsi_client.h:封装 APSI 客户端能力,可调用receiver_cliapsi_client_config.json:APSI 客户端参数配置sql_client.h:定义SQLClient,负责密钥生成、CKKS 加解密与 join 预处理sql_client.cpp:SQLClient的实现
apsi_server.h:封装 APSI 服务端能力,可调用sender_cliapsi_server_config.json:APSI 服务端参数配置sql_server.h:定义SQLServer,负责 SQL 解析与SELECT计算sql_server.cpp:SQLServer的实现
config.h:定义Config结构体,集中管理路径、地址和表前缀config.txt:项目实际运行配置params.h:定义SQLParams,当前包含固定的 CKKS 参数
crypto_utils.*:TFHE 相关加密表处理逻辑data_structure.h:定义明文表、密文列和合表等核心数据结构file_utils.*:文件读写与路径相关工具networking.*:网络通信相关工具
test/apsi_cli:APSI 直接调用相关测试test/data:查询过程中的中间文件与样例数据test/parameters:APSI 推荐参数 JSON 文件test/ssh_keys:测试使用的 SSH 密钥
如果你第一次阅读这个仓库,推荐按下面顺序进入代码:
- 先看 README.md 了解整体目标。
- 再看 src/HomSQL/common/config.txt 了解运行依赖的路径配置。
- 然后阅读 src/HomSQL/client/sql_client.h 和 src/HomSQL/server/sql_server.h 把握客户端与服务端分工。
- 最后通过 test/select_test.cpp 和 test/inner_join_test_server.cpp 理解当前实现与验证方式。
- 项目仍处于原型阶段
INNER JOIN的测试流程尚未完全实现交集隐私保护- 部分路径和参数仍依赖本地配置文件
- 双端联调依赖本地环境、数据文件和 SSH 配置
- 完善密密外包查询场景
- 降低运行配置对本地绝对路径的依赖
- 梳理更稳定的测试脚本与一键运行方式
- 补充更完整的 SQL 语法与示例