NKDBsec/README.md

290 lines
8.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

![LOGO](./NKDBsec_logo.png)
## 概述
NKDBsec是由[南开大学数据与智能系统安全教育部重点实验室](https://cyber.nankai.edu.cn/)和[北京安华金和有限公司](https://www.dbsec.cn/)联合推出的安全多方计算框架,主要用于大数据下的数据联合分析和其他隐私计算算法的开发,典型应用包括多方医疗机构数据联合诊断、多方银行联合征信、多方秘密共享数据库联合查询等等。
NKDBsec是一个基于[Rosetta](https://github.com/LatticeX-Foundation/Rosetta)改造而成的安全多方计算框架。Rosetta是一个基于tensorflow开发的安全多方计算框架主要用于隐私保护机器学习。但是由于其底层使用的tensor结构大量的张量计算不太适用于大数据下的数据联合分析和其他隐私计算算法的开发。目前产业界也缺少针对秘密共享数据库、数据联合分析等应用的MPC框架。
基于这个现状NKDBsec将原版Rosetta框架进行了底层改造使之可以更加适用于数据联合分析与数据库操作等场景。改造后的框架基础算子性能得到了非常大的提升。**目前我们开源的是NKDBsec0.1版本**后续将在这个基础之上进行很多增量工作推出更全面的版本。NKDBsec将其基本算子进行了一个对比测试测试结果详见下表
测试硬件配置Intel(R) Xeon(R) CPU E5-2660 v3 @ 2.60GHz 20核 40线 1000M带宽
测试数量级10<sup>7</sup>(基础运算千万级别)
| **测试算法** | **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
确认满足以上环境需求和安装包之后,然后进入项目的根目录,执行如下指令即可完成部署:
```bash
python3 setup.py install
```
用户在使用框架进行开发的时候只需要在文件中添加以下两行代码即可使用NKDBsec框架
```python
import numpy as np
import dbsecmpc
```
## 使用样例
对于NKDBsec框架我们支持两种使用方式一种是单机多线程模拟另一种是多机交互。我们分别给出两个使用样例
#### 1、单机多线程模拟
对于test.py示例
```python
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界面输入如下命令即可运行此示例
```bash
python3 test.py
```
#### 2、多机交互操作
```python
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模拟第一个计算参与方
```bash
python3 test1.py
```
第二个bash模拟第一个计算参与方
```bash
python3 test2.py
```
第三个bash模拟第一个计算参与方
```bash
python3 test3.py
```
## 接口说明
目前NKDBsec提供如下基本运算接口用户可以在此之上调用接口实现相应的MPC任务。
**1、操作类型四则运算**
1加法运算OP_ADD调用方式
```python
dbsecmpc.opvector(rtx, rty, dbsecmpc.OP_ADD)
```
2减法运算OP_SUB调用方式
```python
dbsecmpc.opvector(rtx, rty, dbsecmpc.OP_SUB)
```
3乘法运算OP_MUL调用方式
```python
dbsecmpc.opvector(rtx, rty, dbsecmpc.OP_MUL)
```
4除法运算OP_DIV调用方式
```python
dbsecmpc.opvector(rtx, rty, dbsecmpc.OP_DIV)
```
5模运算OP_MOD调用方式
```python
dbsecmpc.opvector(rtx, rty, dbsecmpc.OP_MOD)
```
**2操作类型比较操作**
1大于比较OP_GREATER调用方式
```python
dbsecmpc.opvector(rtx, rty, dbsecmpc.OP_GREATER)
```
2小于比较OP_LESS调用方式
```python
dbsecmpc.opvector(rtx, rty, dbsecmpc.OP_LESS)
```
3大于等于比较OP_GREATEREQUAL调用方式
```python
dbsecmpc.opvector(rtx, rty, dbsecmpc.OP_GREATEREQUAL)
```
4小于等于比较OP_LESSEQUAL调用方式
```python
dbsecmpc.opvector(rtx, rty, dbsecmpc.OP_LESSEQUAL)
```
5等于比较OP_EQUAL调用方式
```python
dbsecmpc.opvector(rtx, rty, dbsecmpc.OP_EQUAL)
```
6不等比较OP_NOTEQUAL调用方式
```python
dbsecmpc.opvector(rtx, rty, dbsecmpc.OP_NOTEQUAL)
```
**3逻辑运算**
1与运算OP_AND调用方式
```python
dbsecmpc.opvector(rtx, rty, dbsecmpc.OP_AND)
```
2或运算OP_OR调用方式
```python
dbsecmpc.opvector(rtx, rty, dbsecmpc.OP_OR)
```
3非运算OP_NOT调用方式
```python
dbsecmpc.opvector(rtx, dbsecmpc.OP_NOT)
```
4异或运算OP_XOR调用方式
```python
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]()许可证开放使用。