NKDBsec/README.md

8.8 KiB
Raw Blame History

LOGO

概述

NKDBsec是由南开大学数据与智能系统安全教育部重点实验室北京安华金和有限公司联合推出的安全多方计算框架,主要用于大数据下的数据联合分析和其他隐私计算算法的开发,典型应用包括多方医疗机构数据联合诊断、多方银行联合征信、多方秘密共享数据库联合查询等等。

NKDBsec是一个基于Rosetta改造而成的安全多方计算框架。Rosetta是一个基于tensorflow开发的安全多方计算框架主要用于隐私保护机器学习。但是由于其底层使用的tensor结构大量的张量计算不太适用于大数据下的数据联合分析和其他隐私计算算法的开发。目前产业界也缺少针对秘密共享数据库、数据联合分析等应用的MPC框架。

基于这个现状NKDBsec将原版Rosetta框架进行了底层改造使之可以更加适用于数据联合分析与数据库操作等场景。改造后的框架基础算子性能得到了非常大的提升。目前我们开源的是NKDBsec0.1版本后续将在这个基础之上进行很多增量工作推出更全面的版本。NKDBsec将其基本算子进行了一个对比测试测试结果详见下表

测试硬件配置Intel(R) Xeon(R) CPU E5-2660 v3 @ 2.60GHz 20核 40线 1000M带宽

测试数量级107(基础运算千万级别)

测试算法 Rosetta NKDBsec
加法操作 4min59s 3.8s
减法操作 5min0s 3.9s
乘法操作 5min1s 9.2s
除法操作 5min2s 9.1s
比较运算 6min57s 2min2s
5min4s 11.2s
5min6s 10.7s
异或 5min2s 12.2s

安装与部署

安装版本NKDBsec0.1 操作系统Ubuntu18.04+ python版本python3.6+ 依赖包numpy 确认满足以上环境需求和安装包之后,然后进入项目的根目录,执行如下指令即可完成部署:

python3 setup.py install

用户在使用框架进行开发的时候只需要在文件中添加以下两行代码即可使用NKDBsec框架

import numpy as np
import dbsecmpc

使用样例

对于NKDBsec框架我们支持两种使用方式一种是单机多线程模拟另一种是多机交互。我们分别给出两个使用样例

1、单机多线程模拟

对于test.py示例

import numpy as np
import dbsecmpc
import time
import json
curt = time.time()
from multiprocessing import Process

# conf部分做好多线程模拟的端口配置这部分的端口设置可以由用户自己定义需要注意的是配置时最好避开常用的端口否则会造成线程冲突和程序卡死。
conf = {
    "NODE_INFO": [
        {
            "HOST": "127.0.0.1",
            "PORT": 25500,
            "NODE_ID": "P0"
        },
        {
            "HOST": "127.0.0.1",
            "PORT": 25700,
            "NODE_ID": "P1"
        },
        {
            "HOST": "127.0.0.1",
            "PORT": 25900,
            "NODE_ID": "P2"
        }
    ],
    "DATA_NODES": [
        "P0",
        "P1",
        "P2"
    ],
    "COMPUTATION_NODES": {
        "P0": 0,
        "P1": 1,
        "P2": 2
    },
    "RESULT_NODES": [
        "P0",
        "P1",
        "P2"
    ]
}

def test(id):
    # conf部分用于初始化通信端口操作无需修改
    confbuf = json.dumps(conf)
    dbsecmpc.init(id, confbuf)

    np.random.seed(199)
    colnum, rownum = 2, 10
    
    # P0方进行输入
    xplaintable = np.random.rand(colnum * rownum)*(100)
    xplaintable.shape = (colnum, rownum)
    print("P0 input: ", xplaintable)
    rtx = dbsecmpc.privateinput(["P0"], xplaintable)

    # P1方进行输入
    np.random.seed(307)
    yplaintable = np.random.rand(colnum * rownum)*(100)
    yplaintable.shape = (colnum, rownum)
    print("P1 input: ", yplaintable)
    rty = dbsecmpc.privateinput(["P1"], yplaintable)
    
    # 调用OP_ADD和OP_MUL运算符执行隐私计算操作
    res = dbsecmpc.opvector(dbsecmpc.opvector(rtx, rty, dbsecmpc.OP_ADD), rty, dbsecmpc.OP_MUL)
    print("P{} secret share: ".format(id), res)

    # 调用reveal函数将秘密共享计算结果由P2方进行恢复后打印验证
    res = dbsecmpc.reveal(["P2"], res)
    print("P{} output: ".format(id), res)

pc1 = Process(target = test, args=(0,))
pc2 = Process(target = test, args=(1,))
pc3 = Process(target = test, args=(2,))

st = time.time()
pc1.start()
pc2.start()
pc3.start()

pc1.join()
pc2.join()
pc3.join()
print(time.time() - st)

然后进入test.py所在的bash界面输入如下命令即可运行此示例

python3 test.py

2、多机交互操作

import time
curt = time.time()
import json
import numpy as np

import dbsecmpc


# conf写法参考Rosetta的CONFIG.json文件
conf = {
    "NODE_INFO": [
        {
            "HOST": "10.10.160.2",
            "PORT": 44122,
            "NODE_ID": "P0"
        },
        {
            "HOST": "10.10.160.3",
            "PORT": 42143,
            "NODE_ID": "P1"
        },
        {
            "HOST": "10.10.160.4",
            "PORT": 53169,
            "NODE_ID": "P2"
        }
    ],
    "DATA_NODES": [
        "P0",
        "P1",
        "P2"
    ],
    "COMPUTATION_NODES": {
        "P0": 0,
        "P1": 1,
        "P2": 2
    },
    "RESULT_NODES": [
        "P0",
        "P1",
        "P2"
    ]
}

def main(parid):
    np.random.seed(199)
    colnum, rownum = 2, 100000
    lefttable = np.random.rand(colnum * rownum)*(2**10)
    lefttable.shape = (colnum, rownum)
    confbuf = json.dumps(conf)
    dbsecmpc.init(parid, confbuf)
    s_lefttable = dbsecmpc.privateinput(["P0"], lefttable)
    res = dbsecmpc.opvector(s_lefttable[0], s_lefttable[1], dbsecmpc.OP_ADD)
    res = dbsecmpc.reveal(["P0"], res)
    print(res)

if __name__ == '__main__':
    # 此处需要注意NKDBsec是三个参与方进行交互模拟所以需要建立三个py文件比如分别命名为test1.py, test2.py, test3.py
    # 对于test1.py文件此处为"main(0)", 其余两个文件main的参数分别为1和2然后使用三个进程进行模拟即可运行此实例。
    main(0)

第一个bash模拟第一个计算参与方

python3 test1.py

第二个bash模拟第一个计算参与方

python3 test2.py

第三个bash模拟第一个计算参与方

python3 test3.py

接口说明

目前NKDBsec提供如下基本运算接口用户可以在此之上调用接口实现相应的MPC任务。 1、操作类型四则运算 1加法运算OP_ADD调用方式

dbsecmpc.opvector(rtx, rty, dbsecmpc.OP_ADD)

2减法运算OP_SUB调用方式

dbsecmpc.opvector(rtx, rty, dbsecmpc.OP_SUB)

3乘法运算OP_MUL调用方式

dbsecmpc.opvector(rtx, rty, dbsecmpc.OP_MUL)

4除法运算OP_DIV调用方式

dbsecmpc.opvector(rtx, rty, dbsecmpc.OP_DIV)

5模运算OP_MOD调用方式

dbsecmpc.opvector(rtx, rty, dbsecmpc.OP_MOD)

2、操作类型比较操作 1大于比较OP_GREATER调用方式

dbsecmpc.opvector(rtx, rty, dbsecmpc.OP_GREATER)

2小于比较OP_LESS调用方式

dbsecmpc.opvector(rtx, rty, dbsecmpc.OP_LESS)

3大于等于比较OP_GREATEREQUAL调用方式

dbsecmpc.opvector(rtx, rty, dbsecmpc.OP_GREATEREQUAL)

4小于等于比较OP_LESSEQUAL调用方式

dbsecmpc.opvector(rtx, rty, dbsecmpc.OP_LESSEQUAL)

5等于比较OP_EQUAL调用方式

dbsecmpc.opvector(rtx, rty, dbsecmpc.OP_EQUAL)

6不等比较OP_NOTEQUAL调用方式

dbsecmpc.opvector(rtx, rty, dbsecmpc.OP_NOTEQUAL)

3、逻辑运算 1与运算OP_AND调用方式

dbsecmpc.opvector(rtx, rty, dbsecmpc.OP_AND)

2或运算OP_OR调用方式

dbsecmpc.opvector(rtx, rty, dbsecmpc.OP_OR)

3非运算OP_NOT调用方式

dbsecmpc.opvector(rtx, dbsecmpc.OP_NOT)

4异或运算OP_XOR调用方式

dbsecmpc.opvector(rtx, dbsecmpc.OP_XOR)

引用方式

如果需要引用我们的项目,可以参考如下引用格式。

    @misc{NKDBsec,
      author = {Junjian Shi, Zekun Fei, Zheli Liu, Xiaotao Liu, Yun Pan, Hao Yang, Jihong Guo},
      title = {{NKDBsecAn MPC Framework for Collaborative Database Analysis}},
      howpublished = {\url{https://osredm.com/nankaicyber/NKDBsec}},
      year={2024}
    }

许可证

NKDBsec代码库基于GNU Lesser General Public License v3.0许可证开放使用。