-
Notifications
You must be signed in to change notification settings - Fork 152
API‐Support
在某些数据分析场景中,数据提供方仅愿意以API形式(HTTP API)提供数据,而不愿意提供完整的数据集。这一方面是因为完整的数据集泄漏了更多的隐私,另一方面也是因为完整的数据集太大,在使用量不大时,不适合提供如此大量的数据。
因此,Fidelius需要在EAnalyzer中提供对API的支持。。
- 数据提供方:以API形式或数据集形式提供数据,与以往一样,数据提供方持有枢钥。
- API:指HTTP API,这里是一个简单的Github的API,一个API可能有参数,也可能没有参数。API的参数通常可以描述为一个字典(dictionary),其中key,value均为字符串。
- APIMeta:用于描述数据提供方给出的API,其中的信息包括数据提供方的枢公钥、API URL、 API说明、API 参数列表、API结果描述。对一个API
$h$ ,我们将其APIMeta记为$M(h)=\lbrace\mathsf{Pk}_p, U, D\rbrace$ 其中$\mathsf{Pk}_p$ 为数据提供方的枢公钥,$U$ 为API的URL,$D$ 为API的描述信息,包括API说明,API参数列表,API描述结果。
其他概念,例如典钥,枢私钥转发,EKeyMgr,都沿用以往的概念。
在Fidelius的使用场景中,通常分为三个角色,数据提供方、计算节点(即Analyzer的部署节点)以及用户。
计算节点是好奇且可能作恶的,也就是说,计算节点会试图窃取并修改API的请求数据和API的返回结果。数据提供方以及用户均认为计算节点是好奇且作恶的。
除此之外,计算节点还有可能与数据提供方合谋,提供虚假数据。我们不考虑其他合谋情况,例如用户和计算节点的合谋,这种合谋不会带来收益,因此不会发生。
如下图所示,系统引入FAPI Proxy和FAPI Dispatcher, 其中,FAPI Proxy部署在数据提供方一侧,用于注册API,解密API请求,加密API结果,以及和FAPI Dispatcher的通信; FAPI Dispatcher部署在Analyzer一侧,用于管理各个API,以及和FAPI Proxy的通信。FAPI Proxy是一个独立的进程或服务,可以和HTTP API Service部署在不同的节点上; FAPI Dispatcher则是一个模块,部署在Analyzer的进程内。
注意,图中省略了EKeyMgr。
虽然图中并未标明,但数据提供方、Analyzer、以及用户之间可以使用区块链或其他第三方通信。具体区别见下文的说明。
首先,数据提供方需要“发布”API数据,这和Fidelius中以往的发布数据流程不同。用户使用FAPI Proxy注册API,注册API时,需要提供枢公钥、API URL,以及其他说明信息,例如API参数说明,返回结果说明等。
如图所示,FAPI Proxy将这些信息发送给FAPI Dispatcher,FAPI Dispatcher在本地记录相关信息。对于一个API,
下图说明了调用API的过程,具体说明如下:
-
用户发起请求,注意,用户的请求不一定是直接的API请求,也可能是一个计算请求,该计算请求间接的需要使用数据提供方的API;用户请求可能是加密的或非加密的;
-
在EAnalyzer中生成相应的API请求,在生成API请求时,EAnalyzer需要从FAPI Dispatcher中获取对应的APIMeta,并使用APIMeta中的枢公钥加密相应的参数,并形成加密的API请求,记为
$\digamma(h, m)=\lbrace I, U, M, \mathsf{Pk}_\iota \rbrace$ , 其中-
$h$ 为对应的API; -
$m$ 为参数明文; -
$I$ 为唯一标识,用于区分不同的API调用; -
$U$ 为API的URL; -
$M$ 为加密的参数,$M = \mathsf{Enc}(\mathsf{Pk}_p, m)$ , 此处$\mathsf{Pk}_p$ 为数据提供方的枢公钥; -
$\mathsf{Pk}_\iota$ 为EAnalyzer的内部公钥。
-
-
将加密后的API请求
$\digamma(h, m)$ 转交给FAPI Dispatcher,由其查找相应的FAPI Proxy,并发送给具体的FAPI Proxy; -
FAPI Proxy接收加密API请求,使用APIMeta中对应的枢私钥解密后,得到明文API请求;
-
FAPI Proxy发送请求;
-
FAPI Proxy获得请求结果
$r$ ,并使用加密请求中的内部公钥加密结果,也就是说,对于加密请求$\digamma(h, m)$ , 其结果记为$\Gamma(h, m, r)=\lbrace I, U, R \rbrace$ ,其中-
$R$ 为加密结果,即$R=\mathsf{Enc}(\mathsf{Pk}_\iota, r)$ 。
-
-
发送
$\Gamma(h, m, r)$ 给FAPI Dispatcher,此处需要同时将相应的枢私钥转发信息发送给FAPI Dispatcher; -
转发给相应的EAnalyzer,以及枢私钥转发;
-
解密,
$r = \mathsf{Dec}(\mathsf{Sk}_\iota, R)$ 获得请求结果明文,并进行相应的处理,例如使用用户的枢公钥加密; -
返回结果给用户。
使用区块链(智能合约)能带来额外的好处,例如防止数据提供方与计算节点的合谋,对于每次API调用进行存证等,这就要求上述步骤中的4、7使用区块链进行交互。对此的描述我们未来给出。
注意,使用区块链会带来一定的性能损失,降低调用API的性能,因此,应酌情考虑。
本文图片使用drawio绘制,源文件如下 FAPI-design.zip