讲师 :冯宇扬(浙江大学)
核心主题 :基于PIR技术的跨企业数据隐私查询(隐语Secret Note平台实操)
分享框架:案例背景 → 数据集准备 → 实验流程(含平台实操)
一、案例背景与核心技术
1. 业务场景
-
参与方:企业A(新型高科技企业,研发生物降解材料,未公开/未专利)、企业B(持有历史技术记录数据库)。
-
核心需求:企业A需查询自身研发的材料是否已被企业B的数据库记录,但需严格保密查询内容。
-
风险规避:防止企业B获知查询信息后,泄露A的研发方向、恶意抢注专利或倒卖查询信息。
2. 核心技术:PIR(Private Information Retrieval,隐私信息检索)
定义:用户从数据库查询数据时,确保数据库持有方无法获知查询的具体内容,实现"查询可见,目标隐匿"。
(1)PIR分类
| 分类维度 | 类型 | 核心说明 |
|---|---|---|
| 按服务器数量 | 单服务器PIR | 仅需一个数据库服务器即可完成隐私查询 |
| 多服务器PIR | 依赖多个服务器协同,通过数据分片实现隐私保护 | |
| 按查询类型 | Index PIR | 数据库为数组结构,用户查询数组下标i,获取对应内容,服务器不知i的值 |
| Keyword PIR | 数据库为键值对(Keyword-vi),用户查询"键(Keyword)",获取"值(vi)",服务器不知Keyword | |
| 本次实践选用:单服务器Keyword PIR |
二、数据集准备
实验涉及企业A(查询方,对应平台Client节点)与企业B(数据库持有方,对应平台Server节点)两类数据集,按节点分别存储。
| 持有方 | 文件名称 | 文件内容与作用 |
|---|---|---|
| 企业B(Server节点) | db.csv | 模拟数据库,含"k(键)""value(值)"两列,存储若干键值对(如k=fr对应value=rm) |
| serversecretkey.bin | 企业B在PIR技术中使用的加密密钥 | |
| 企业A(Client节点) | pirquery.csv | 记录待查询的"键",仅含"k"一列,单条数据(本案例查询k=fr) |
三、实验流程(隐语Secret Note平台实操)
前置准备:已启动Client(企业A)、Server(企业B)两个节点,实验文件已分别上传至对应节点。
核心目标:Client在不泄露查询关键词(fr)的前提下,从Server的加密数据库中获取对应value(rm)。
1. 实验总流程
-
获取可用端口,配置瑞(Ray)集群(节点通讯基础)。
-
再次获取可用端口,配置SPU(安全计算核心组件,PIR基于SPU实现)。
-
PIR Setup阶段(Server单独执行:将明文数据库加密为密文数据库)。
-
PIR Online阶段(双方共同执行:Client发起查询,获取结果)。
2. 详细实操步骤
步骤1:导入依赖库
-
操作:Client与Server节点共同执行代码,导入隐私计算所需核心包(secretflow、spu)。
-
平台标识:代码块右上角标记"client和server",点击运行后双方同步执行。
步骤2:配置瑞(Ray)集群
-
获取可用端口 :
执行
unused_tcp_port函数(自定义实现),Client与Server分别获取唯一未占用端口(每次运行结果不同)。 -
记录两端口号,用于后续节点通讯配置。
-
初始化瑞集群 :
调用
sf.init()函数,核心参数包括:
address:瑞集群地址。 -
cluster_config:含parties(所有参与方IP+端口,IP从平台右上角"节点信息"获取)、selfparty(标识自身节点:Client/Server)。 -
Client与Server需分别执行对应代码块(
selfparty参数不同),通过"执行上方所有"功能同步触发,确保集群通讯正常。
步骤3:配置SPU(安全计算组件)
-
重新获取端口 :执行
unused_tcp_port函数,获取新的未占用端口(SPU需独立端口运行)。 -
创建SPU实例 :
调用
sf.spu()函数,核心配置参数在spu.conf中定义:
nodes:填入Client/Server的IP与新端口。 -
protocol:多方安全计算协议(本实验用3pc2k)。 -
field:计算用有限域(128bit)。 -
sign_mode:签名函数进位方式(signModeRail)。 -
执行代码后生成SPU实例,为PIR提供安全计算环境。
步骤4:PIR Setup阶段(Server单独执行)
核心任务:Server用自身密钥将明文数据库(db.csv)加密为密文数据库(sdb)。
-
获取文件路径 :执行
os.getcwd()函数,获取Server节点工作空间路径,存入current_dir变量。 -
调用PIR加密函数 :执行
spu.pir_setup(),核心参数:
server:被查询方节点名(server)。 -
input_path:明文数据库路径(db.csv)。 -
k_columns:数据库中"键"对应的列名(k)。 -
label_columns:数据库中"值"对应的列名(value)。 -
oprf_key_path:Server密钥路径(serversecretkey.bin)。 -
setup_path:加密后数据库输出路径(工作目录下sdb文件)。 -
bucket_size:数据库分桶大小(本实验设为16,因数据规模小)。 -
结果验证:Server工作目录新增sdb文件,即为加密后的数据库。
步骤5:PIR Online阶段(双方共同执行)
核心任务:Client发起隐私查询,获取对应结果,Server全程不知查询关键词。
-
密钥路径配置:将Server的密钥(serversecretkey.bin)复制到容器tmp目录(确保加密验证可用)。
-
发起PIR查询 :执行
spu.pir_query(),核心参数:
server/client:对应参与方节点名。 -
server_setup_paths:加密数据库路径(sdb)。 -
client_k_columns:Client查询文件中"键"的列名(k)。 -
client_input_paths:Client查询文件路径(pirquery.csv)。 -
client_output_paths:查询结果输出路径(pirresult.csv)。 -
结果验证 :
Client工作目录新增pirresult.csv文件。
-
打开文件可见:查询k=fr对应的结果为rm,与数据库一致,查询隐私性与结果准确性均达标。
四、实验核心结论
-
PIR技术有效解决跨企业数据查询的隐私保护问题,实现"数据可用不可见"。
-
隐语Secret Note平台通过节点配置、SPU安全计算等组件,可高效落地PIR技术实践。
-
本次实验成功验证:Client在保密查询关键词的前提下,精准获取Server数据库中的目标数据。