Skip to content

Repository files navigation

HomSQL

HomSQL 是一个基于 HE3DB 的同态数据查询原型系统,目标是让客户端负责输入 SQL 与本地加解密,而服务端在尽量不接触明文的前提下完成查询计算。

当前项目聚焦于隐私保护查询场景,主要覆盖两类业务方向:

  • 明密联合查询
  • 密密外包查询

项目目标

理想流程如下:

  1. 客户端准备查询语句与本地密钥材料。
  2. 通过 APSI 完成交集发现或 join 前置处理。
  3. 服务端在合表结果上执行 SELECT 与条件过滤等计算。
  4. 客户端接收结果并完成解密。

当前进度

目前已经完成的部分:

  • 明密查询场景下的 SELECT
  • 明密查询场景下的 INNER JOIN

当前实现思路:

  1. 先利用 APSI 完成 INNER JOIN 所需的交集处理。
  2. 再在合表结果上执行 SELECT 列选择或表达式计算。
  3. 最后通过 WHERE 条件过滤目标行。

已支持能力

SELECT

  • 支持选择单列
  • 支持表达式查询
  • 表达式支持明密混合的加、减、乘运算
  • 支持括号表达式

更细的语法约束可参考 test/select_test.cpp 中的注释与示例。

INNER JOIN

  • 使用 APSI 处理 join 前的交集相关流程
  • 服务端基于交集结果执行后续合表逻辑

更详细的设计说明可参考 test/inner_join_test_server.cpp 中的注释。

当前测试实现里,客户端会直接把明文交集发送给服务端,因此这一部分仍然是原型验证阶段,而不是完整的隐私保护实现。

技术栈与依赖

  • C++20
  • CMake 3.16+
  • OpenMP
  • HE3DB
  • TFHEpp
  • Microsoft SEAL
  • APSI 相关测试组件

根据仓库中的 Dockerfile,当前开发环境主要基于 Ubuntu 22.04,常见依赖包括:

  • g++-10
  • cmake
  • libgmp-dev
  • nlohmann-json3-dev
  • libboost-all-dev
  • openssh-server

快速开始

1. 编译

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/bin
  • build/lib

2. 配置

项目运行时使用 src/HomSQL/common/config.txt 管理路径、数据文件、通信地址和表前缀等参数。

如果你要在本地运行测试,通常需要先检查这些内容是否与当前机器环境一致:

  • 数据文件路径
  • 密文输出目录
  • SSH 私钥路径
  • 客户端与服务端地址

3. 运行测试

当前测试目标由 test/CMakeLists.txt 注册。

单端测试可直接运行对应可执行文件;涉及客户端与服务端交互的测试,需要分别打开两个终端,先运行服务端,再运行客户端。

常见测试目标如下:

测试目标说明
select_testSELECT 功能验证
ckks_testCKKS 基础使用说明与验证
ckks_test_server / ckks_test_client双端加密查询流程测试
cli_test_server / cli_test_clientAPSI 客户端/服务端测试
inner_join_test_server / inner_join_test_client明密 INNER JOIN 原型测试

项目结构

.
├─ src/ # HomSQL 核心源码
│ └─ HomSQL/
│ ├─ client/ # 客户端逻辑、密钥与查询预处理
│ ├─ server/ # 服务端 SQL 解析与计算
│ ├─ common/ # 配置与公共参数
│ └─ utils/ # 加密、文件与网络工具
├─ test/ # 测试代码、样例数据与参数
├─ thirdparty/ # 第三方依赖
├─ CMakeLists.txt # 顶层构建入口
└─ Dockerfile # 容器化构建环境

核心模块说明

src/HomSQL/client

  • apsi_client.h:封装 APSI 客户端能力,可调用 receiver_cli
  • apsi_client_config.json:APSI 客户端参数配置
  • sql_client.h:定义 SQLClient,负责密钥生成、CKKS 加解密与 join 预处理
  • sql_client.cppSQLClient 的实现

src/HomSQL/server

  • apsi_server.h:封装 APSI 服务端能力,可调用 sender_cli
  • apsi_server_config.json:APSI 服务端参数配置
  • sql_server.h:定义 SQLServer,负责 SQL 解析与 SELECT 计算
  • sql_server.cppSQLServer 的实现

src/HomSQL/common

  • config.h:定义 Config 结构体,集中管理路径、地址和表前缀
  • config.txt:项目实际运行配置
  • params.h:定义 SQLParams,当前包含固定的 CKKS 参数

src/HomSQL/utils

  • crypto_utils.*:TFHE 相关加密表处理逻辑
  • data_structure.h:定义明文表、密文列和合表等核心数据结构
  • file_utils.*:文件读写与路径相关工具
  • networking.*:网络通信相关工具

测试目录说明

  • test/apsi_cli:APSI 直接调用相关测试
  • test/data:查询过程中的中间文件与样例数据
  • test/parameters:APSI 推荐参数 JSON 文件
  • test/ssh_keys:测试使用的 SSH 密钥

适合谁看

如果你第一次阅读这个仓库,推荐按下面顺序进入代码:

  1. 先看 README.md 了解整体目标。
  2. 再看 src/HomSQL/common/config.txt 了解运行依赖的路径配置。
  3. 然后阅读 src/HomSQL/client/sql_client.hsrc/HomSQL/server/sql_server.h 把握客户端与服务端分工。
  4. 最后通过 test/select_test.cpptest/inner_join_test_server.cpp 理解当前实现与验证方式。

当前限制

  • 项目仍处于原型阶段
  • INNER JOIN 的测试流程尚未完全实现交集隐私保护
  • 部分路径和参数仍依赖本地配置文件
  • 双端联调依赖本地环境、数据文件和 SSH 配置

后续可以继续补强的方向

  • 完善密密外包查询场景
  • 降低运行配置对本地绝对路径的依赖
  • 梳理更稳定的测试脚本与一键运行方式
  • 补充更完整的 SQL 语法与示例

About

基于HE3DB与APSI技术的同态密文数据库查询系统,支持 SQL 语句在不解密状态下实现多表 Join、数值计算及条件过滤。

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages