隐语 PSI benchmark 白皮书,新鲜出炉

简介: 隐语 PSI benchmark 白皮书,新鲜出炉


导语:为了方便大家了解隐语的Benchmark,我们设计了10分钟上手手册,包含了亮点介绍、SecretFlow集群的易用搭建、Benchmark脚本、两方和三方的Benchmark,使相关业务方做调研时方便拿到可度量的性能数据和可复现的路径。

隐语PSI亮点

隐私集合求交(Private Set Intersection,PSI)是一类特定的多方安全计算(Multi-Party Computation, MPC)问题,其问题可以简单理解为:Alice 输入集合 X,Bob 输入集合 Y,双方执行 PSI 协议可以得到 Alice 和 Bob 两者的交集,同时不在交集范围内的部分是受保护的,即 Alice 和 Bob 无法学习出交集以外的任何信息。隐私集合求交(PSI)协议有很多分类方法,按照底层依赖的密码技术分类主要包括:

  • 基于公钥密码的PSI方案,包括:基于判定型密钥交换(Decisional Diffie-Hellman,DDH)的PSI方案和RSA盲签名的PSI方案;
  • 基于不经意传输(Oblivious Transfer,OT)的PSI方案;
  • 基于通用MPC的PSI方案,例如基于混淆电路(Garbled Circuit,GC)的PSI方案;
  • 基于同态加密(Homomorphic Encryption,HE)的PSI方案。

隐私集合求交(PSI)协议按照参与方的数量进行分类,可分为:

  • 两方PSI:参与方为2个;
  • 多方PSI:参与方>2个。

隐私集合求交(PSI)协议按照设定安全模型分类,可分为:

  • 半诚实模型的PSI;
  • 恶意模型的PSI。

SecretFlow SPU 实现了半诚实模型下的两方和三方PSI协议,密钥安全强度是128bit,统计安全参数是40bit。

两方PSI协议:

  • 基于DDH的PSI(Private Set Intersection)协议

基于DDH的PSI协议先对简单易于理解和实现,依赖的密码技术已被广泛论证,通信量低,但计算量较大。

隐语实现了基于椭圆曲线(Elliptic Curve)群的DDH PSI协议,支持的椭圆曲线类型包括:Curve25519,SM2,Secp256k1。本次benchmark选用的曲线是Curve25519。

  • 基于OT扩展的KKRT16

KKRT16是第一个千万规模(224)求交时间在1分钟之内的PSI方案,通信量较大;

隐语实现了KKRT16协议,并参考了进年来的性能优化和安全改进方案,例如:stash-less CuckooHash,[GKWW20]中 FixedKey AES作为 correlation-robust 哈希函数。

  • 基于PCG的BC22

BC22 PSI依赖的PCG(Pseudorandom Correlation Generator)方案是近年来mpc方向的研究热点,相比KKRT16计算量和通信两方面都有了很大改进,从成本(monetary cost)角度更能满足实际业务需求。PCG实现依赖LPN(Learning Parity with Noise)问题,由于是2022年最新的协议,协议的安全性还需要更多密码专家的分析和论文。

隐语v0.7中实现了BC22 PSI方案,其中的PCG/VOLE使用了emp-zk中的[WYKW21]实现,欢迎大家审查和进一步改进;

三方PSI(Private Set Intersection)协议

  • 基于DDH的三方PSI协议

隐语实现了自研的基于 ECDH 的三方 PSI 协议,注意我们实现的这个协议会泄漏两方交集大小,请自行判断是否满足使用场景的安全性,本次benchmark选用的曲线是Curve25519。

复现方式

一、测试机型环境

  • Python:3.8
  • pip: >= 19.3
  • OS: CentOS 7
  • CPU/Memory: 推荐最低配置是 8C16G
  • 硬盘:500G

二、安装conda

使用conda管理python环境,如果机器没有conda需要先安装,步骤如下:

分别在三台机器的root目录下执行


#sudo apt-get install wgetwget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh#安装bash Miniconda3-latest-Linux-x86_64.sh# 一直按回车然后输入yesplease answer 'yes' or 'no':>>> yes# 选择安装路径, 文件名前加点号表示隐藏文件Miniconda3 will now be installed into this location:>>> ~/.miniconda3# 添加配置信息到 ~/.bashrc文件Do you wish the installer to initialize Miniconda3 by running conda init? [yes|no][no] >>> yes#运行配置信息文件或重启电脑source ~/.bashrc#测试是否安装成功conda --version

三、安装secretflow

分别在三台机器的root目录下执行














# 创建干净的python环境conda create -n sf-benchmark python=3.8
# 进入benchmark 环境conda activate sf-benchmark
# 安装secretflowpip install -U secretflow
# 创建一个sf-benchmark目录mkdir sf-benchmarkcd sf-benchmark

1.验证安装是否成功

root目录下输入python然后回车依次执行,每执行一条回车一次







>>> import secretflow as sf>>> sf.init(['alice', 'bob', 'carol'], num_cpus=8, log_to_driver=True)>>> dev = sf.PYU('alice')>>> import numpy as np>>> data = dev(np.random.rand)(3, 4)>>> sf.reveal(data)

如下图所示就代表环境搭建成功了

四、创建节点并启动集群

1.创建ray header节点

创建ray header节点,选择一台机器为主机,在主机上执行如下命令,ip替换为主机的内网ip,命名为alice,端口选择一个空闲端口即可注意:192.168.0.1 ip为mock的,请替换为实际的ip地址alice机器执行



RAY_DISABLE_REMOTE_CODE=true \ray start --head --node-ip-address="192.168.0.1" --port="9394" --resources='{"alice": 8}' --include-dashboard=False

2.创建从属节点

创建从属节点,在bob机器执行如下命令,ip依然填alice机器的内网ip,命名为bob,端口不变bob机器执行



RAY_DISABLE_REMOTE_CODE=true \ray start --address="192.168.0.1:9394" --resources='{"bob": 8}'

创建从属节点,在carol机器执行如下命令,ip依然填alice机器的内网ip,命名为carol,端口不变carol机器执行



RAY_DISABLE_REMOTE_CODE=true \ray start --address="192.168.0.1:9394" --resources='{"carol": 8}'

3.验证节点是否启动

在python中测试节点是否启动成功,任意选一台机器输入python,执行下列代码,参数中address为头节点(alice)的地址,拿alice机器来验证,每输入一行下列代码回车一次:alice机器输入python后再执行







>>> import secretflow as sf>>> sf.init(address='192.168.0.1:9394')>>> alice = sf.PYU('alice')>>> bob = sf.PYU('bob')>>> sf.reveal(alice(lambda x : x)(2))>>> sf.reveal(bob(lambda x : x)(2))

如下图就代表节点创建成功了同时我们也可以通过ray status去看节点的状态,前提是先进入sf环境(conda activate sf-benchmark)

4.生成数据

把脚本generate_psi.py:https://github.com/secretflow/spu/blob/main/spu/psi/tools/generate_psi.py传到alice机器的root目录下

执行如下代码






# 生成三份一千万数据python3 generate_psi.py 10000000
# 生成三份一亿数据python3 generate_psi.py 100000000

把生成的psi_1.csv cp到benchmark目录下,再通过scp的命令把psi_2.csv/psi_3.csv分别移到bob的benchmark目录下跟carol的benchark目录下

5.限制宽带/延迟

#100Mbps 20mstc qdisc add dev eth0 root handle 1: tbf rate 100mbit burst 256kb latency 800ms tc qdisc add dev eth0 parent 1:1 handle 10: netem delay 20msec limit 8000

  • 清除限制

tc qdisc del dev eth0 root

  • 查看已有配置

tc qdisc show dev eth0

6.Benchmark脚本

支持的PSI协议列表:

  • ECDH_PSI_2PC
  • KKRT_PSI_2PC
  • BC22_PSI_2PC
  • ECDH_PSI_3PC





import sysimport timeimport logging
from absl import appimport spuimport secretflow as sf
# init loglogging.basicConfig(stream=sys.stdout, level=logging.INFO)
# SPU settingscluster_def = {'nodes': [# <<< !!! >>> replace <192.168.0.1:12945> to alice node's local ip & free port        {'party': 'alice', 'id': 'local:0', 'address': '192.168.0.1:12945', 'listen_address': '0.0.0.0:12945'},# <<< !!! >>> replace <192.168.0.2:12946> to bob node's local ip & free port        {'party': 'bob', 'id': 'local:1', 'address': '192.168.0.2:12946', 'listen_address': '0.0.0.0:12946'},# <<< !!! >>> if you need 3pc test, please add node here, for example, add carol as rank 2# {'party': 'carol', 'id': 'local:2', 'address': '127.0.0.1:12347'},    ],'runtime_config': {'protocol': spu.spu_pb2.SEMI2K,'field': spu.spu_pb2.FM128,    },}
def main(_):
# sf init# <<< !!! >>> replace <192.168.0.1:9394> to your ray head    sf.init(address='192.168.0.1:9394')    alice = sf.PYU('alice')    bob = sf.PYU('bob')    carol = sf.PYU('carol')
# <<< !!! >>> replace path to real parties local file path.    input_path = {        alice: '/data/psi_1.csv',        bob: '/data/psi_2.csv',# if run with `ECDH_PSI_3PC`, add carol# carol: '/data/psi_3.csv',    }    output_path = {        alice: '/data/psi_output.csv',        bob: '/data/psi_output.csv',# if run with `ECDH_PSI_3PC`, add carol# carol: '/data/psi_output.csv',    }    select_keys = {        alice: ['id'],        bob: ['id'],# if run with `ECDH_PSI_3PC`, add carol# carol: ['id'],    }    spu = sf.SPU(cluster_def)
# prepare data    start = time.time()
    reports = spu.psi_csv(        key=select_keys,        input_path=input_path,        output_path=output_path,        receiver='alice',  # if `broadcast_result=False`, only receiver can get output file.        protocol='KKRT_PSI_2PC',  # psi protocol        precheck_input=False,  # will cost ext time if set True        sort=False,  # will cost ext time if set True        broadcast_result=False,  # will cost ext time if set True    )    print(f"psi reports: {reports}")    logging.info(f"cost time: {time.time() - start}")
    sf.shutdown()
if __name__ == '__main__':    app.run(main)

五、Benchmark报告

目前bechmark数据中,bc22 psi的性能还在进一步工程优化, 单测spu中bc22协议内核的性能对比可以参考pcg psi的介绍

相关文章
|
安全 算法 Oracle
「隐语小课」Blazing Fast PSI 协议解读
「隐语小课」Blazing Fast PSI 协议解读
1317 0
|
机器学习/深度学习 人工智能 搜索推荐
Codewave学习体验分享:低代码开发世界的黑马
Codewave学习体验分享:低代码开发世界的黑马
|
安全 Java 应用服务中间件
【JavaWeb】Tomcat底层机制和Servlet运行原理
网络通信:Tomcat使用Java的Socket API来监听特定的端口(通常是8080),接收来自客户端的HTTP请求。 线程池:Tomcat使用线程池来处理并发的请求。当有新的请求到达时,Tomcat会从线程池中获取一个空闲线程来处理该请求,这样可以提高处理效率。 生命周期管理:Tomcat负责管理Servlet和其他Web组件的生命周期,包括初始化、请求处理和销毁等阶段。(init(), run())
|
运维 负载均衡 网络协议
linux网络管理(链路聚合、桥接网络、故障排查、常用工具)
网卡的链路聚合就是将多块网卡连接起来,当一块网卡损坏,网络依旧可以正常运行,可以有效的防止因为网卡损坏带来的损失,同时也可以提高网络访问速度。
1531 0
linux网络管理(链路聚合、桥接网络、故障排查、常用工具)
|
JSON 中间件 数据格式
VOS,呼叫系统,呼叫中心中间件-线路配置
线路和线路组 每个线路可设置最大并发数 每个线路可设置休息时间,比如FXO网关一个电话线呼叫一次后,都需要等待一会儿,才可以继续拨打第二通电话,有了休息时间这个参数,就可以解决这个问题了。 重拨,可以根据SIP从错误代码,挂断原因,通话时间和呼叫时间设置是否需要重拨。 并发数,可以设置一个线路并发数,并发数超过了,就可以自动跳过这个线路。 优先级,可以给线路设置优先级,这样就可以实现主用线路和后背线路了。 线路配置 cti_line@domain [哈希表] key 线路名字 value 线路配置JSON格式 | ``` { "params": { "count": 1,
795 102
|
存储 C语言 C++
线性表的基本操作(C语言实现)
这篇文章介绍了使用C语言实现线性表的基本操作,包括顺序存储和链式存储两种方式,并通过DEV C++工具进行演示和代码实现。
线性表的基本操作(C语言实现)
|
机器学习/深度学习 算法 安全
2024.3.20隐语训练营第3讲笔记:详解隐私计算框架及技术要点
隐语架构是一个分层设计,支持不同技术路线,确保高内聚、低耦合,增强开放性。它包括产品层(如SecretPad和SecretNote)、算法层(如PSI和PIR协议)、计算层(RayFed和SPU)、资源层(KUSCIA)和互联互通及跨域管控机制。该架构旨在提供高性能、易用的隐私计算解决方案,支持MPC、TEE、SCQL等,并允许不同背景的研究人员参与。
365 0
|
机器学习/深度学习 SQL 人工智能
隐私计算框架“隐语”介绍及展望(附ppt)
隐私计算框架“隐语”介绍及展望(附ppt)
971 0
|
SQL 存储 关系型数据库
MySQL备份:mydumper 备份恢复工具生产实战
MySQL备份:mydumper 备份恢复工具生产实战
|
运维 安全 数据安全/隐私保护
隐语(SecretFlow)联邦学习实训营第一期笔记
**摘要:** 本文探讨了数据可信流通的概念,强调了数据来源确认、使用范围界定、流程追溯和风险防范的重要性。数据流通分为内循环(安全域内)和外循环(跨域),其中外循环面临黑客攻击、内部泄露和数据滥用等风险。为建立技术信任,提出了身份验证、利益对齐、能力预期和行为审计四点要求,涉及隐私计算、可信计算等技术。隐语作为隐私计算框架,提供服务以支持数据安全流通,通过开源降低接入门槛,并具备统一架构、原生应用、开放拓展、高性能和多轮安全验证等优势。开源隐语助力解决数据权属和信任问题,促进数据要素的安全流通。