Fidelius

来自典枢
跳到导航 跳到搜索

Fidelius 简介

Fidelius 是由熠智科技自主研发并完全开源的隐私计算中间件,基于机密计算和密态计算等技术,为数据要素的安全流通保驾护航。目前您可以在 Github 上查看源代码。 Fidelius 具有如下特点:

  • 全流程隐私保护: 原始数据不出域,支持模型参数、计算过程、计算结果弹性隐私保护,提供监管合规组件。
  • 企业级性能保证: 自研高性能数据分析框架,支持大规模集群部署,满足工业场景性能需求。
  • 通用场景支持: 不依赖第三方验证的跨平台私密数据传输和身份验证,支持 WAN/LAN 多网络环境部署;兼容 TensorFlow、PyTorch 等主流机器学习框架。

Fidelius 遵从 Apache License 2.0 协议和 GNU General Public License 3.0 协议。

“Fidelius” 由来

Fidelius来自于《哈利波特》中特殊而复杂的符咒:赤胆忠心咒(Fidelius Charm),其主要的用途是将一个秘密隐藏在“守密人”心中,除非守密人主动对他人泄露这个秘密,否则此秘密永远无法被人发现。

系统架构

下图简述了 Fidelius 系统中的各个模块及其之间的关系。

Architecture.png
  • 服务平台:为各个模块提供入口,并为上层应用提供接入方式。根据需要,服务平台的表现形式分为两部分,可供用户直接访问的网页和可供应用访问的 API。在服务平台内部,核心是区块链,除此之外还提供了其他组件,这些组件可以根据需求进行组合、定制。
    • 开发平台:为开发者提供了定制数据分析算法的工具,包括
      1. 不同的数据分析框架,用于实现不同的业务场景;
      2. 开发工具,包括可信编译器、静态分析工具等,用于帮助开发者更便捷的完成开发任务;
      3. 部署、运维工具,用于帮助开发者将开发完成的算法提交到区块链上、监控算法的使用情况、以及对算法的使用进行授权;
      4. 需要注意的是,受限于区块链的存储性能,算法本身并不存储在区块链上,仅将算法的关键信息存储在区块链上;算法本身可以使用额外的文件存储服务。
    • 区块链:区块链提供了信息传输通道,保证了关键信息可溯源以及不可篡改。这些信息包括算法提供方发布的算法信息,数据提供方发布的数据信息,任务请求信息以及交付的结果信息。通过部署在区块链之上的智能合约,在提交任务的计算结果时,系统会对数据使用结果进行验证,保证数据、算法、参数以及结果四者的一致性,从根本上保证数据合作的可信。Fidelius 并不依赖于特定的区块链实现,因此能够部署在不同区块链系统上。当然,因为 Fidelius 的性能,如吞吐量、响应时间等会受到区块链系统的影响,所以我们推荐使用高性能的 YeeZChain 作为底层区块链平台。
    • 合规组件:得益于区块链不可篡改的特性,合规组件可以通过区块链中的数据进行审计,包括对于发布的算法,数据和数据适用方等的审计。还可以禁止不符合合规要求的算法、数据、使用请求等。
  • 隐私计算层:负责完成数据使用的交互过程,包括数据元文件的生成、更新,数据分析任务的生成、发布、执行,以及计算结果的交付。隐私计算层的核心是 Fidelius 隐私计算中间件,该中间件基于 TEE 可信执行环境,提供了数据的通用计算分析支持。
  • 工具层:在大多数场景下,隐私计算层是 “私有的”,即隐私计算层的相关信息是不愿与服务平台共享的,为此,我们为使用隐私计算的用户提供了相关的管理工具,这些工具包括对于隐私计算节点的用户管理、数据管理、资源管理及权限管理,还包括对于隐私计算节点中运行的任务的监控及统计。

解决方案原理

下图描述了基于 Fidelius 实现数据合作的抽象流程。

基于Fidelius的数据合作流程.png

该方案的核心是 Fidelius 中间件,通常来说Fidelius中间件会分别运行在数据提供方和数据使用方中(以 Fidelius 节点或者 Fidelius SDK 的形式),需要注意的是,在大多数场景下,数据提供方和数据使用方之间没有直接的数据交换,即原始数据不会离开数据提供方的安全域,数据提供方仅公开元数据描述文件,这可以从根本上避免敏感数据的泄露问题。

同时,整个方案也结合了区块链技术,由于区块链本身具有去中心化、公开可验证等特性,其可以作为可信的传输通道和数据计算验证平台。

关于区块链和隐私计算结合的详细介绍,可以阅读 Fidelius和区块链

典型场景

Fidelius 支持多种数据合作场景,我们按照输入数据、参数和模型的隐私保护需求划分为以下几个典型场景:

本地数据服务

数据提供方在本地部署并管理相关的存储、计算服务器,数据使用方使用算法提供方的算法请求数据提供方对数据进行计算,并获得计算结果。

可信要求

  • 原始数据不可篡改
  • 请求参数加密且不可篡改
  • 返回结果加密且不可篡改

由于原始数据存储在数据提供方本地,在数据提供方能够保证数据存储安全的情况下,可以不加密原始数据,以保证计算性能。

执行流程

  1. 数据注册:数据提供方传输原始数据至本地的 Fidelius 节点(此处简称 FP),并自动生成相关元数据描述文件,同时元数据被发布至区块链网络;
  2. 任务发布:数据使用方本地的 Fidelius 节点 或者 Fidelius SDK(此处简称 FC)通过区块链获取元数据描述文件后提交给数据使用方,后者根据数据描述信息提供相应的数据分析任务(通常为执行程序的二进制文件),FC 将数据分析任务通过区块链网络转移到 FP;
  3. 数据计算:FP 对任务进行检测后,基于原始数据和任务完成数据计算,生成计算结果和相应的证明,并将加密后的计算结果和证明发布至区块链网络;
  4. 结果返回:加密的分析结果被保存在区块链网络中,区块链中的智能合约基于证明和结果进行验证,当计算结果通过验证后,FC 将计算结果解密后返回给数据使用方。

托管数据服务

在很多情况下,数据提供方出于成本、管理等考虑,本地没有相关的存储、计算服务器,而是委托给第三方(云服务厂商)进行数据的存储和计算;数据使用方使用算法提供方的算法请求第三方(数据托管服务方)对数据进行计算,并获得计算结果。

可信要求

  • 数据对第三方不可见
  • 数据不可篡改
  • 数据使用请求需要经过数据提供方授权
  • 请求参数加密且不可篡改
  • 请求结果加密且不可篡改

执行流程

  1. 数据注册:数据提供方通过本地的 Fidelius 节点或者本地运行的 Fidelius SDK (此处简称 FP)对数据进行加密,生成相关元数据描述文件和权限证明,同时元数据描述文件被发布至区块链网络,加密数据发送至第三方的 Fidelius 节点;
  2. 数据使用方:数据使用方所在的 Fidelius 节点(此处简称 FC)通过区块链获取元数据描述文件后提交给数据提供方,后者根据数据描述信息提供相应的数据分析任务(通常为执行程序的二进制文件),FC 将数据分析任务通过区块链网络转移到至 FP;
  3. 数据授权:FP 根据区块链网络中的请求,对该次任务进行数据使用授权,并将该授权提交到区块链网络中;
  4. 数据计算:第三方运行的 Fidelius 节点对任务进行检测后,基于加密数据、任务及数据授权完成数据计算,生成计算结果和相应的证明,并将加密后的计算结果和证明发布至区块链网络。
  5. 结果返回:加密的分析结果被保存在区块链网络中,区块链中的智能合约基于证明和结果进行验证,当计算结果通过验证后,FC 将计算结果解密后返回给数据使用方。

多数据源数据服务

由于算法本身的复杂性或业务的要求,计算结果需要基于多个数据源得出,且需要多个数据源集中到同一个计算环境中。这一场景类似于前述的数据托管服务,都需要数据授权这一步,不同的是存在多个数据源,且计算环境可能部署在某一个数据源。

可信要求

  • 数据对第三方不可见
  • 数据不可篡改
  • 数据使用请求需要经过数据提供方授权
  • 请求参数加密且不可篡改
  • 请求结果加密且不可篡改

执行流程

  1. 数据注册:每个数据提供方传输原始数据至本地的 Fidelius 节点(此处简称 FP),后者对数据进行加密,自动生成相关元数据描述文件和权限证明,同时元数据描述文件被发布至区块链网络,加密数据发送至第三方;
  2. 任务发布:数据使用方所在的 Fidelius 节点(此处简称 FC)通过区块链获取元数据描述文件后提交给数据使用方,后者根据数据描述信息提供相应的数据分析任务(通常为执行程序的二进制文件),FC 将数据分析任务通过区块链网络转移到 FP;
  3. 数据授权:每个数据提供方根据区块链网络中的请求,对该次任务进行数据使用授权,并将该授权提交到区块链网络中;
  4. 数据计算:第三方对任务进行检测后,基于加密数据、任务及所有数据授权完成数据计算,生成计算结果和相应的证明,并将加密后的计算结果和证明发布至区块链网络;
  5. 结果返回:加密的分析结果被保存在区块链网络中,区块链中的智能合约基于证明和结果进行验证,当计算结果通过验证后,FC 将计算结果解密后返回给数据使用方。

模型服务

算法本身包含了专业知识、或通过机器学习得到的训练参数,因此具有相当的商业价值,需要保护其中的关键参数。数据提供方与数据使用方为同一方,此处称为算法使用方,在算法提供方的许可下使用算法对数据进行处理。计算环境部署在算法使用方本地。

可信要求

  • 模型参数不可见、且不可篡改
  • 算法使用方需要在算法提供方的许可下使用

注意:此处计算结果不需要加密,数据也不需要机密性或不可篡改的检查。

执行流程

  1. 数据注册:每个算法提供方传输参数数据至本地的Fidelius节点(此处简称FP),后者对模型参数进行加密,自动生成相关元数据描述文件和权限证明,同时元数据描述文件被发布至区块链网络,加密数据发送至第三方;
  2. 任务发布:算法使用方所在的Fidelius节点(此处简称FC)通过区块链获取元数据描述文件后提交给数据使用方,后者根据算法描述信息及本地数据生成相应的数据分析请求;
  3. 模型授权:算法提供方根据区块链网络中的请求,对该次任务进行数据使用授权,并将该授权提交到区块链网络中;
  4. 数据计算:算法使用方对任务进行检测后,基于任务及模型授权完成数据计算,生成计算结果。

Fidelius 隐私计算中间件

计算模型

Fidelius 隐私计算中间件(简称中间件)基于硬件 TEE 技术,不同的 TEE 实现有不同的名称,为了方便描述,我们统一称之为 enclave(飞地),如同 program(程序)一词一样,根据上下文的不同,enclave 一词既可以表示一个二进制文件,也可以表示一个运行在 TEE 的实例。

中间件依赖于 TEE 的三个特性:

  1. enclave 运行过程中内存不可见、不可修改;
  2. enclave 代码不可修改;
  3. 本地 enclave 之间的认证(attestation)。

下图所示为中间件的计算模型。每个隐私计算任务包括两个 enclave,分别为 EKeyMgr 和算法,其中 EKeyMgr 内置于中间件中,用于管理典钥及典钥相关的操作,算法由开发者提供,用于完成对数据的分析或使用。两个 enclave 通过 ECDH 建立加密信道,保证 enclave 之间的通信是安全的。

Dkey&skey.png

EKeyMgr 在安装部署之后,需要经过某种认证方式保证部署的 EKeyMgr 是正确的,这些认证方式包括但不限于:

  • 使用 TEE 提供商提供的远程认证服务;
  • 独立部署的远程认证服务;
  • 经过培训、认证的操作员的人工核实。

具体认证方式视具体情况确定。

算法 enclave 包含了分析数据的业务逻辑,由不可信环境提供数据源、模型参数及输入参数,在 TEE 环境中处理得到最终的计算结果。

典钥和枢钥

不同于其他机密计算,Fidelius 引入了典钥和枢钥两个重要概念。在 Fidelius 中,EKeyMgr 通过典钥提供了信任根,典钥是一对椭圆曲线下的公私钥对,在 EkeyMgr 中生成,并在生成之后使用 TEE 内的密钥加密典私钥后存储在不可信环境中,因此典私钥只有 EKeyMgr 可见,可以认为典私钥绑定了对应的 EKeyMgr 或隐私计算节点。一个隐私计算节点存在至少一个典私钥。典公钥的原文公开、验证后,上传至区块链。尽管公开的典公钥可以用于任意的加密操作,EKeyMgr 在典私钥上提供的操作是有限的,EKeyMgr 不提供任意的解密操作,即使用典公钥加密的数据也是不能解密并公开的。

枢钥是一对椭圆曲线下的公私钥对,与典钥不同的是,枢钥不在 TEE 环境中生成,而是在一般的环境下生成,例如浏览器、客户端、移动端等。枢钥与数据、算法模型、请求等业务相关,用户需要妥善保存自己的枢私钥,以免造成隐私泄露。想了解如何生成典钥及枢钥,请参考 Fidelius部署教程

许可

许可是指在给定输入参数下,允许给定算法使用给定模型参数或给定数据源进行计算的密码学证明,按照用途分为模型参数许可以及数据源许可。 许可作为输入的一部分,由模型提供方或数据提供方提供算法。算法在开始执行实际的计算任务前,会对许可进行验证。当许可验证通过了,才会执行实际的计算任务。一个许可包括三个部分:

  • 数据源或模型参数的 Hash;
  • 许可提供方的公钥,一般是枢公钥;
  • 对于输入参数、数据源或模型参数的 Hash、计算节点的典公钥以及目前算法 Hash 的签名,签名私钥为枢私钥。

对于许可的检查是可选的。

生成授权

./yterminus --allowance --use-param PARAM_HASH --use-privatekey-file KEY_FILE --use-enclave-hash ENCLAVE_HASH --tee-pubkey DIAN_PKEY --dhash DATA_HASH

其中$PARAM_HASH为参数哈希,$KEY_FILE为您的枢钥文件,$ENCLAVE_HASH为算法哈希,$DIAN_PKEY为典公钥, $DATA_HASH为数据哈希。

以上命令默认使用椭圆曲线算法生成授权码,若要使用国密算法生成授权码,请参考如下命令:

./yterminus --crypto ENCRYPTION_ALGO --allowance --use-param PARAM_HASH --use-privatekey-file KEY_FILE --use-enclave-hash ENCLAVE_HASH --tee-pubkey DIAN_PKEY --dhash DATA_HASH

算法抽象

Fidelius 隐私计算中间件将一个计算任务表示为了一个 C++ 类(如下),并通过模版参数提供了各个不同的配置以方便开发者定制不同的算法、满足不同的业务需求。

template<typename Crypto, 
    typename DataSession, 
    typename ParserT, 
    typename Result, 
    typename ModelT = void, 
    template <typename> class DataAllowancePolicy = ignore_data_allowance, 
    template <typename> class ModelAllowancePolicy = ignore_model_allowance
> class algo_wrapper;

对于各个模板参数的说明如下:

  • Crypto:密码算法簇,目前支持 ypc::crypto::eth_sgx_crypto 和 ypc::crypto::gmssl_sgx_crypto。
    • ypc::crypto::eth_sgx_crypto:椭圆曲线为 SECP256k1,哈希函数为 SHA3-256,对称加密算法为 Rijndael128GCM,兼容以太坊。
    • ypc::crypto::gmssl_sgx_crypto:椭圆曲线为 SM2,哈希函数为 SM3,对称加密算法为 SM4。
  • DataSession: 数据源方式,支持无数据源(noinput_data_stream),单一未加密数据源(raw_data_stream),单一加密数据源(sealed_data_stream),多数据源(multi_data_stream)且其中每一个数据源都是加密数据。
  • ParserT:表示自定义的算法类,由开发者自行开发。
  • Result:表示结果的类型,表示支持本地结果(local_result,结果不加密),上链结果(onchain_result,结果的数据大小能够上链),链下结果交付(offchain_result,结果的数据大小不能够上链),结果加密转发(foward_result)。
  • ModelT: 表示模型参数的类型,是 ff::util::ntobject<...>,由开发者指定,默认为 void,即没有模型参数。
  • DataAllowancePolicy: 表示数据源的许可验证策略,支持不检查数据源的许可(ignore_data_allowance)或检查数据源的许可(check_data_allowance)。
  • ModelAllowancePolicy: 表示模型的许可验证策略,支持不检查模型的许可(ignore_model_allowance)或检查模型参数的许可(check_model_allowance)。

通过选取不同的参数,中间件能够支持不同的场景。以常见的数据可用不可见为例,数据在数据提供方本地存储,且数据提供方提供相应的隐私计算节点,且计算的最终结果加密后提供给隐私计算节点,且计算的最终结果加密后提交到区块链上,此时的算法实现如下:

ypc::algo_wrapper<ypc::crypto::eth_sgx_crypto, 
                ypc::raw_data_stream, 
                enclave_iris_means_parser, 
                ypc::onchain_result<ypc::crypto::eth_sgx_crypto>
> pw;
YPC_PARSER_IMPL(pw);

其中 YPC_PARSER_IMPL 是一个宏,用于隐藏相关代码实现。

安装

目前,Fidelius 仅支持 Ubuntu 系统。我们提供了从源安装的方式。您也可以从源代码编译安装,但是请注意,由于 Intel SGX 的限制,一个 Enclave 在构建时需要使用 RSA 3072 的私钥进行签名,自行编译安装时使用的私钥与通过源安装的版本所使用的私钥并不相同,因此,自行编译安装的 Fidelius 可能与从源安装版本不兼容。目前 Fidelius 稳定版为 v1.0release版,新版本即将推出,您可以切换到 patterns分支 查看,注意该版本目前并未提供相关技术支持。更详细的内容参见 Fidelius部署教程

使用 Fidelius

作为一个中间件,Fidelius 更多是被上层服务,例如典枢来使用,而不是单独使用。此处,我们提供 Fidelius示例教程,用于说明 Fidelius 的工作流程。

Fidelius SDK

详细的 Fidelius SDK 说明请参考 FideliusSDK 说明文档

Fidelius 和区块链

Fidelius 的设计哲学中,我们并没有将 Fidelius 设计成与区块链紧耦合的关系,这是因为:

  • Fidelius 的初衷是为了解决数据合作的隐私保护问题,而不仅仅局限于区块链上的数据隐匿;
  • 我们发现当前大部分企业很难实现业务全部上链,这一方面是由于区块链作为底层基础设施仍然存在许多缺陷尚待解决,另一方面企业往往已经有成熟的数据存储平台(数据中心或者云存储),没有必要再基于区块链进行数据存储。

尽管如此,Fidelius中也使用了区块链技术,这里区块链主要起到了如下作用:

  • 可信第三方:数据提供方和数据使用方之间基于区块链实现了交互,由于共识机制本身的去中心化特性,实际上区块链扮演了可信第三方的作用。具体来说,区块链能够
    1. 存储数据,且数据不会被篡改;
    2. 传输数据,且不依赖于中心化的证书机制(例如 HTTPS 所依赖的证书);
    3. 验证数据,即对数据使用情况及分析结果的验证。
  • 抵抗作弊:由于区块链的特点,被区块链记录的数据合作行为是公开、且不可篡改的,这对于试图通过“刷单”等来影响数据合作的作弊行为有非常好的抵抗作用。虽然不同于在中心化的数据合作平台上处理作弊行为的“黑盒子”,公开的、不可篡改的数据合作记录可以被不断更新的自动化算法或人力检查,是一种有效的抵抗作弊的手段。

Fidelius 版本及历史

了解每个 Fidelius 的版本变化