一、PSI 技术概述
(一)定义与功能
PSI(Private Set Intersection),即隐私集合求交,是一种特殊的 MPC(安全多方计算)协议。其核心功能是:在保护数据隐私的前提下,使多个参与方能够协同计算出各自数据集合的交集,而不泄露交集之外的任何信息。
如,Alice 持有集合 X,Bob 持有集合 Y,通过 PSI 协议,双方可共同获得交集 X∩Y,且不会泄露各自集合中除此之外的其他元素。

(二)分类
- 按参与方数量 :可分为两方 PSI(2-Party PSI)与多方 PSI(Multi-Party PSI)。
- 按数据集大小平衡性 :有平衡 PSI(Balanced PSI)与非平衡 PSI(Unbalanced PSI)。平衡 PSI 指各方数据集大小相近;而非平衡 PSI 则适用于一方数据量远大于另一方的场景。
- 按安全假设模型 :分为半诚实模型(Semi-honest Model)与恶意模型(Malicious Model)。半诚实模型假设各方会遵循协议但不会试图从中间结果中窃取额外信息;恶意模型则考虑参与方可能采取任何手段破坏协议以获取更多信息。

(三)基础组件与协议实现
- 基础组件层 :包括 ECC(椭圆曲线密码术)、AES(高级加密标准)、HAS(可能是哈希函数相关组件)、OT(Oblivious Transfer,盲传)、OPRF(Oblivious Pseudorandom Function,盲伪随机函数)、PRG(Pseudorandom Generator,伪随机数生成器)等。这些组件是构建 PSI 协议的底层技术支撑,提供了加密、隐私保护、随机性生成等关键功能。
- PSI 协议实现层 :涵盖了多种具体的 PSI 协议实现,如 Ecdh(椭圆曲线 Diffie-Hellman)、Kkrt16、Bc22(pcg-psi)、ec-oprf PSI(用于非平衡 PSI)、dp-psi 等。这些协议基于上述基础组件构建,以实现不同场景下的隐私集合求交功能。例如,Ecdh-PSI 利用椭圆曲线 Diffie-Hellman 密钥交换原理来实现两方之间的安全求交;Kkrt16 协议则通过扩展 OT 技术,优化了 PSI 的性能和效率。
二、SPU 实现 PSI 的优势与特色
(一)性能优化
- 底层密码操作改进 :如增加对 intel-crypto multi-buffer 的支持,从而提升加密解密操作的效率;对 ECC 操作进行优化,使其能够更高效地处理大规模数据集。
- 跨平台互联互通 :采用开放协议,如 ECDH-PSI,确保不同平台和系统之间能够实现 PSI 功能的互联互通,方便在复杂的多系统协作环境中应用 PSI 技术。
- 协议性能优化 :通过引入新技术(如 PCG-PSI)和对现有协议的改进(如优化 BaRK-OPRF、CuckooHash 等组件),在通信量和运行时间上取得了一定的优势。例如,PCG-PSI 相比传统方案在通信量和运行时间上都有显著的减少,能够更高效地处理大规模数据集。
(二)功能拓展
- 支持多种 PSI 变体 :除了基本的 PSI 功能外,还支持 PSI-CA(求交集大小)、PSI-Payload Analytics(对交集元素进行进一步的数据分析)、uCircuit PSI(基于电路的 PSI)等扩展功能,以满足不同应用场景下的多样化需求。
- 适配多种安全模型 :不仅支持半诚实模型下的 PSI 协议,还实现了适用于恶意模型的 mini-PSI 协议(适合小数据集),增强了 PSI 技术在面对不同安全威胁场景时的适用性。
(三)易用性提升
- 统一的 API 接口 :提供了如 bucket_psi(高级 API)和 mem_psi(低级 API)等统一的入口函数,方便开发者根据实际需求选择合适的接口进行 PSI 功能的集成和开发。同时,还支持通过分桶求交的方式处理大规模数据(可达 10 亿规模),并提供了完善的输入输出处理功能。
- 多种数据处理方式支持 :如对 csv 文件和内存数据都提供了相应的批量读取和处理实现(CsvBatchProvider 和 MemoryBatchProvider),便于在不同数据存储和处理场景下使用 PSI 技术。
三、PSI 技术应用与开发实践
(一)应用场景
- 数据分析与挖掘 :在多个数据持有方之间,通过 PSI 技术安全地求出共同数据子集,进而进行联合数据分析、挖掘关联规则等,如跨机构的医疗数据分析、金融数据共享分析等。
- 隐私保护的数据协作 :适用于需要在保护数据隐私的前提下进行多方数据协作的场景,如广告定向投放中的用户兴趣匹配、供应链中的供应商与采购商的数据协同等。
(二)开发流程
- 环境准备 :确保各参与方已正确安装和配置 Ray 集群,并且每个参与方都具备相应的计算资源和网络连通性。
- 初始化 SecretFlow :使用 sf.init() 函数进行 SecretFlow 的初始化,配置各参与方的地址、网络参数以及安全相关的设置(如 TLS 配置),建立各参与方之间的通信连接。
- 启动 SPU 设备 :定义 SPU 集群配置(包括各参与方的地址、监听地址、运行时配置等),并通过 sf.SPU() 创建 SPU 设备实例,为后续的 PSI 操作提供安全计算环境。
- 执行 PSI 操作 :调用 SPU 提供的 PSI API(如 spu.psi_csv()),设置 PSI 参数(如协议类型、曲线类型、输入输出路径、是否广播结果等),执行隐私集合求交操作,并获取求交结果。
(三)示例代码
- Ray 集群启动 :Alice 端启动 Ray 主节点的命令如下:
ray start --head --node-ip-address="alice_ip" --port="alice_port" --include-dashboard=False --disable-usage-stats
Bob 端启动 Ray 主节点的命令如下:
ray start --head --node-ip-address="bob_ip" --port="bob_port" --include-dashboard=False --disable-usage-stats
- SecretFlow 初始化 :Alice 端的初始化代码如下:
sf_cluster_config = {
'parties': {
'alice': {
'address': 'alice_ip:alice_port',
'listen_addr': '0.0.0.0:alice_listen_port'
},
'bob': {
'address': 'bob_ip:bob_port',
'listen_addr': '0.0.0.0:bob_listen_port'
}
},
'self_party': 'alice'
}
sf.init(address='alice_ray_head_node_address', cluster_config=sf_cluster_config, tls_config=tls_config)
Bob 端的初始化代码如下:
sf_cluster_config = {
'parties': {
'alice': {
'address': 'alice_ip:alice_port',
'listen_addr': '0.0.0.0:alice_listen_port'
},
'bob': {
'address': 'bob_ip:bob_port',
'listen_addr': '0.0.0.0:bob_listen_port'
}
},
'self_party': 'bob'
}
sf.init(address='bob_ray_head_node_address', cluster_config=sf_cluster_config, tls_config=tls_config)
SPU 设备启动 :定义 SPU 集群配置并创建 SPU 设备的代码如下:
spu_cluster_def = {
'nodes': [
{'party': 'alice', 'address': 'alice_node_ip:alice_spu_port', 'listen_address': '0.0.0.0:alice_spu_listen_port'},
{'party': 'bob', 'address': 'bob_node_ip:bob_spu_port', 'listen_address': '0.0.0.0:bob_spu_listen_port'}
],
'runtime_config': {
'protocol': spu.spu_pb2.SEMI2K,
'field': spu.spu_pb2.FM128
}
}
spu = sf.SPU
PSI 执行 :调用 SPU 的 psi_csv 方法执行 PSI 操作的代码示例如下:
reports = spu.psi_csv(
key='id_key',
input_path={'alice': '/alice/input_path.csv', 'bob': '/bob/input_path.csv'},
output_path={'alice': '/alice/output_path.csv', 'bob': '/bob/output_path.csv'},
receiver='alice',
protocol='ECDH_PSI_2PC',
curve_type='CURVE_25519',
precheck_input=False,
sort=False,
broadcast_result=False
)
四、隐语 PSI 后续发展计划
(一)协议研发
- 探索新型 PSI 协议 :如 RS22 协议(基于 vole + okvs 技术),有望进一步提升 PSI 的性能和效率。
- 拓展 PSI 功能范围 :研究和开发 Circuit PSI(基于电路的 PSI)、Multiparty PSI(更高效的多方 PSI 协议)、Malicious PSI(适用于恶意模型的 PSI 协议)等,以满足更广泛的应用场景和安全需求。
(二)调用框架优化
- 构建 PSI 独立代码库 :将 PSI 相关代码进行独立封装和管理,提高代码的可维护性和可复用性。
- 优化入口函数和参数配置 :简化 PSI 的调用流程,提供更直观、易用的接口和参数配置方式,降低开发门槛。
- 改进协议封装架构 :优化协议的层次结构和模块划分,提升协议的灵活性和可扩展性,便于后续的功能拓展和性能优化。
(三)产品化推进
- 轻量化部署方案 :设计和开发更轻量化的 PSI 部署方案,降低硬件资源要求和部署复杂度,使 PSI 技术能够更广泛地应用于资源受限的环境和小型应用场景。
- 算法原理可视化 :通过可视化工具和技术,将 PSI 算法的原理、流程和关键步骤进行直观展示,帮助用户更好地理解和使用 PSI 技术,提升用户体验和接受度。
五、学习总结
通过对 SPU 实现 PSI 技术的深入学习,掌握了 PSI 的基本原理、分类以及多种协议的实现方式,理解了 SPU 在 PSI 实现过程中的性能优化策略、功能拓展方向和易用性提升措施。同时,通过实际的开发示例,熟悉了在隐语框架下进行 PSI 开发的基本流程和关键步骤。这些知识为在数据隐私保护领域应用 PSI 技术提供了坚实的基础,使我能够更好地应对实际项目中涉及多方数据协作和隐私保护的挑战。