介绍:为了方便大家了解SecretFlow的Benchmark,本文设计了10分钟的上手手册,包括亮点介绍,SecretFlow集群的简单上手搭建,Benchmark脚本,两方和三方Benchmarks,赋能相关业务做研究时,方便获取可衡量的性能数据和可重现的路径。密码学PSI亮点私有集交集(PSI)是一种特定类型的多方计算(MPC)问题。它的问题可以简单理解为:Alice输入集合X,Bob输入集合Y,双方可以通过执行PSI协议得到Alice和Bob的交集,不在交集范围内的部分被保护,即Alice而Bob除了交集之外无法学习到任何信息。隐私集交集(PSI)协议有多种分类方法。按照底层密码技术分类,主要包括:基于公钥密码学的PSI方案,包括:基于DecisionalDiffie-Hellman(DDH)的PSI方案和RSA盲签名PSI方案;基于不经意迁移(ObliviousTransfer,OT)的PSI方案;基于通用MPC的PSI方案,如基于混淆电路(GarbledCircuit,GC)的PSI方案;基于同态加密(HomomorphicEncryption,HE)的PSI方案。隐私集交集(PrivacySetIntersection,PSI)协议按参与人数分类,可分为:两方PSI:2个参与方;多方PSI:超过2个参与者。隐私集交集(PrivacySetIntersection,PSI)协议按照设置的安全模型可以分为:半诚实模型的PSI和恶意模型的PSI。SecretFlowSPU在半诚实模型下实现两方和三方PSI协议,密钥安全强度为128bit,统计安全参数为40bit。二方PSI协议:基于DDH的PSI(PrivateSetIntersection)协议。基于DDH的PSI协议简单易懂,易于实现。它所依赖的密码学技术已经得到广泛证明。通信量低,但计算量大。Lingo基于椭圆曲线(EllipticCurve)组实现DDHPSI协议,支持的椭圆曲线类型包括:Curve25519、SM2、Secp256k1。为该基准选择的曲线是Curve25519。KKRT16基于OT扩展的KKRT16是第一个千万规模(224)交集时间在1分钟以内的PSI解决方案,例如:stash-lessCuckooHash,[GKWW20]中的FixedKeyAES作为相关稳健的哈希函数。基于PCG的BC22BC22PSI-dependentPCG(PseudorandomCorrelationGenerator)方案是近年来mpc方向的研究热点。与KKRT16相比,无论是计算还是通信都有了很大的提升,从货币成本的角度更能满足实际情况。业务需求。PCG的实现依赖于LPN(LearningParitywithNoise)问题。由于是2022年最新的协议,协议的安全性还需要更多密码学专家的分析和论文。Lingov0.7中实现了BC22PSI方案,emp-zk中使用[WYKW21]实现了PCG/VOLE。欢迎您审查并进一步完善;三方PSI(PrivateSetIntersection)协议是基于DDH的三方PSI协议行话实现了自主研发的基于ECDH的三方PSI协议。请注意,我们实现的协议会泄露双方的交集大小。请判断是否符合使用场景的安全性。为该基准选择的曲线是Curve25519。复现方法1、测试模型环境Python:3.8pip:>=19.3OS:CentOS7CPU/内存:推荐最低配置为8C16G硬盘:500G2、安装conda使用conda管理python环境。如果机器没有conda,需要先安装。步骤如下:#分别在三台机器的根目录下执行#sudoapt-getinstallwgetwgethttps://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh#安装bashMiniconda3-latest-Linux-x86_64.sh#一直按回车输入yes请回答'yes'或'no':>>>yes#选择安装路径,在文件名前加一个点表示现在要安装的是隐藏文件Miniconda3到这个位置:>>>~/.miniconda3#添加配置信息到~/.bashrc文件你希望安装程序通过运行condainit来初始化Miniconda3吗?[yes|no][no]>>>yes#运行配置信息文件或重启电脑source~/.bashrc#测试是否安装成功conda--version3.installsecretflow#在三台机器的根目录下分别执行#创建干净的python环境condacreate-nsf-benchmarkpython=3.8#进入基准环境condaactivatesf-benchmark#安装secretflowpipinstall-Usecretflow#创建sf-benchmark目录mkdirsf-benchmarkcdsf-benchmark1.验证安装是否成功在根目录下输入python回车#依次执行,每次执行回车一次>>>importsecretflowassf>>>sf.init(['alice','bob','carol'],num_cpus=8,log_to_driver=True)>>>dev=sf.PYU('alice')>>>importnumpyasnp>>>data=dev(np.random.rand)(3,4)>>>sf.reveal(data)如下图表示环境搭建成功4.创建节点并启动集群1.创建ray头节点Createarayheader节点,选择一台机器作为Host,在主机上执行以下命令,将ip替换为主机的内网ip,命名为alice,端口选择一个空闲的端口注意:192.168.0.1ip是mock,请替换用实际的ip地址#alice机器执行RAY_DISABLE_REMOTE_CODE=true\raystart--head--node-ip-address="192.168.0.1"--port="9394"--resources='{"alice":8}'--include-dashboard=False2。创建从节点要创建从节点,在bob机器上执行如下命令。ip还是填alice机器的内网ip,名字叫bob,端口不变。#bob机器执行RAY_DISABLE_REMOTE_CODE=true\raystart--address="192.168.0.1:9394"--resources='{"bob":8}'创建slave节点,在carol机器上执行如下命令,ip还是填alice机器的内网ip,名字为carol,端口不变#carol机器执行RAY_DISABLE_REMOTE_CODE=true\raystart--address="192.168.0.1:9394"--resources='{"carol":8}'3.验证节点是否启动在python中测试节点是否启动成功,选择任意一台机器输入python,执行以下代码,参数中的地址为头节点(alice)的地址,拿alicemachine验证,每行输入以下代码并回车一次:#alicemachineenterpython然后执行>>>importsecretflowassf>>>sf.init(address='192.168.0.1:9394')>>>alice=sf.PYU('alice')>>>bob=sf.PYU('bob')>>>sf.reveal(alice(lambdax:x)(2))>>>sf.reveal(bob(lambdax:x)(2))如下图所示,表示节点创建成功。同时我们也可以通过raystatus查看节点状态,前提是先进入sf环境(condaactivatesf-benchmark)4.生成数据,使用脚本generate_psi。py:https://github.com/secretflow/spu/blob/main/spu/psi/tools/generate_psi.py转移到alice机器根目录,执行以下代码#生成三份1000万数据python3generate_psi.py10000000#生成三份1亿条数据python3generate_psi.py100000000将生成的psi_1.csvcp到benchmark目录,然后通过scp命令将psi_2.csv/psi_3.csv分别移动到bob的benchmark目录和carol的benchmark5.限制目录下的带宽/延迟#100Mbps20mstcqdiscadddeveth0roothandle1:tbfrate100mbitburst256kblatency800mstcqdiscadddeveth0parent1:1handle10:netemdelay20mseclimit8000delcleartcqdiscdevroot查看配置的tcqdiscshowdeveth06.Benchmark脚本支持的PSI协议列表:ECDH_PSI_2PCKKRT_PSI_2PCBC22_PSI_2PCECDH_PSI_3PCimportsysimporttimeimportloggingfromabslimportappimportspuimportsecretflowassf#initloglogging.basicConfig(stream=sys.stdout,level=logging.INFO)#SPUsettingscluster_def={'nodes':[#<<>>将<192.168.0.1:12945>替换为alice节点的本地ip和自由端口{'party':'alice','id':'local:0','address':'192.168.0.1:12945','listen_address':'0.0.0.0:12945'},#<<>>将<192.168.0.2:12946>替换为bob节点的本地ip和自由端口{'party':'bob','id':'local:1','address':'192.168.0.2:12946','listen_address':'0.0.0.0:12946'},#<<>>如果需要3pc测试,请在此处添加节点,例如将carol添加为rank2#{'party':'carol','id':'local:2','address':'127.0.0.1:12347'},],'runtime_config':{'协议':spu.spu_pb2.SEMI2K,'字段':spu.spu_pb2.FM128,},}defmain(_):#sfinit#<<>>右将<192.168.0.1:9394>放到你的射线头sf.init(address='192.168.0.1:9394')alice=sf.PYU('alice')bob=sf.PYU('bob')carol=sf.PYU('卡罗尔')#<<>>将路径替换为真实方本地文件路径。input_path={alice:'/data/psi_1.csv',bob:'/data/psi_2.csv',#如果使用`ECDH_PSI_3PC`运行,添加carol#carol:'/data/psi_3.csv',}output_path={alice:'/data/psi_output.csv',bob:'/data/psi_output.csv',#如果使用`ECDH_PSI_3PC`运行,添加carol#carol:'/data/psi_output.csv',}select_keys={alice:['id'],bob:['id'],#如果使用`ECDH_PSI_3PC`运行,添加carol#carol:['id'],}spu=sf.SPU(cluster_def)#准备数据start=time.time()reports=spu.psi_csv(key=select_keys,input_path=input_path,output_path=output_path,receiver='alice',#if`broadcast_result=False`,只有接收者可以得到输出文件。protocol='KKRT_PSI_2PC',#psiprotocolprecheck_input=False,#如果设置为真将花费额外时间sort=False,#如果设置为真将花费额外时间broadcast_result=False,#如果设置为真将花费额外时间)print(f"psireports:{reports}")logging.info(f"costtime:{time.time()-start}")sf.shutdown()if__name__=='__main__':app.run(main)五、Benchmark根据目前的bechmark数据,bc22psi的性能还在进一步的工程优化中。bc22协议核心在单机测试SPU中的性能对比可以参考pcgpsi的介绍关于SecretFlowSecretFlow官网: www.secretflow.org.cnSecretFlow社区及代码访问: github.com/secretflow gitee.com/secretflow关注微信公众号:行话小剧场
