1,摘要
本文介绍可信计算分类INTEL SGX技术和ARM TRUSTZONE技术技术方案概要,以及应用INTEL SGX技术的蚂蚁区块链TEE硬件隐私链的智能合约开发实践。
2,可信计算和2种技术方案INTEL SGX技术和ARM TRUSTZONE技术
【可信计算/可信用计算(Trusted Computing,TC)】是一项由可信计算组(可信计算集群,前称为TCPA)推动和开发的技术。可信计算是在计算和通信系统中广泛使用基于硬件安全模块支持下的可信计算平台,以提高系统整体的安全性。签注密钥是一个2048位的RSA公共和私有密钥对,它在芯片出厂时随机生成并且不能改变。这个私有密钥永远在芯片里,而公共密钥用来认证及加密发送到该芯片的敏感数据。
随着可信计算(Trusted Computing)的发展,可信计算的研究方向已经由传统硬件芯片模式转向了可信执行环境( TEE, Trusted Execution Environment) 这种更容易被广泛应用的模式,基于 Intel 芯片的 SGX 以及基于 ARM 开源框架的 TrustZone 是可信执行环境中最被广泛认知且应用的。
可信计算是一个由多种计算机相关技术组合而成的, 其实有5个技术概念是可信计算的核心:
1. Endorsement key 签注密钥, 签注密钥是一个2048位的RSA公共和私有密钥对,它在芯片出厂时随机生成并且不能改变。这个私有密钥永远在芯片里,而公共密钥用来认证及加密发送到该芯片的敏感数据
2. Secure input and output 安全输入输出 安全输入输出是指电脑用户和他们认为与之交互的软件间受保护的路径。当前,电脑系统上恶意软件有许多方式来拦截用户和软件进程间传送的数据。例如键盘监听和截屏。
3. Memory curtaining 储存器屏蔽 储存器屏蔽拓展了一般的储存保护技术,提供了完全独立的储存区域。例如,包含密钥的位置。即使操作系统自身也没有被屏蔽储存的完全访问权限,所以入侵者即便控制了操作系统信息也是安全的。
4. Sealed storage 密封存储 密封存储通过把私有信息和使用的软硬件平台配置信息捆绑在一起来保护私有信息。意味着该数据只能在相同的软硬件组合环境下读取。例如,某个用户在他们的电脑上保存一首歌曲,而他们的电脑没有播放这首歌的许可证,他们就不能播放这首歌。
5. Remote attestation 远程认证 远程认证准许用户电脑上的改变被授权方感知。例如,软件公司可以避免用户干扰他们的软件以规避技术保护措施。它通过让硬件生成当前软件的证明书。随后电脑将这个证明书传送给远程被授权方来显示该软件公司的软件尚未被干扰(尝试破解)。
这5个关键技术是一个完备的可信计算系统所应该拥有的。
随着可信计算(Trusted Computing)的发展,可信计算的研究方向已经由传统硬件芯片模式转向了可信执行环境( TEE, Trusted Execution Environment) 这种更容易被广泛应用的模式,基于 Intel 芯片的 SGX 以及基于 ARM 开源框架的 TrustZone 是可信执行环境中最被广泛认知且应用的。
2.1 基于INTEL SGX的云安全能力增强
Intel SGX 全称 Intel Software Guard Extensions,是对因特尔体系( IA)的一个扩展,用于增强软件的安全性。将合法软件的安全操作封装在 enclaves(飞地) 中,保护其不受恶意软件的攻击,特权或者非特权的软件都无法访问 enclaves,也就是说,一旦软件和数据位于容器中,即便操作系统或者和 VMM( Hypervisor)被攻破,也无法影响容器里面的代码和数据。 一个 CPU 中可以有多个安全 enclaves。
Intel SGX 的最大优势在于其只信任自己和 Intel CPU,此机制将 SGX 的可信级别提高到了硬件级别。软件层面的攻击甚至操作系统层级的攻击都无法威胁到 SGX创造的可信环境。 此架构很利于用户使用目前基于多租户云服务架构下的软件, 因为即使黑客通过云端植入向 PC 控制底层操作系统( OS) , 因为 SGX 只信任自己和 Intel CPU 的属性,也无法操纵底层操作系统对 SGX 进行攻击。 目前, Intel 在6 代酷睿处理器之后全部配备了 SGX 可信环境。
Intel SGX 业务框架
INTEL SGX的技术特点:
基于SGX的硬件隔离
• 代码运行在Enclave中
• 支持多线程并发,可被中断
只信任CPU
• 完全透明的内存加密
• 18条新指令
Enclave本身没有特权
• 只能运行在用户态
• 内存保护机制
2.2 基于 ARM TRUSTZONE 技术的可信执行环境
相对于基于 Intel 系统特有的可信计算环境 SGX, TrustZone 是 ARM 处理器所特有的安全计算环境。 不同于 Intel SGX 可以生成多个完全封装的 enclaves, TrustZone将一个 CPU 划分为两个平行且隔离的处理环境,一个为普通运行环境,另一个为可信运行环境。 因为两个环境被隔离, 所以很难跨环境操作代码及资源。同时在程序想要进入可信运行环境中时,需要执行安全监控中断指令,让操作系统检查其安全性只有通过检验的程序才能进入安全区。 此机制确保了 TrustZone 的安全性,但也意味着整个系统的安全性由底层操作系统( OS)来全权负责。
随着ARM芯片的普及, TrustZone可信环境获得了更加广泛的应用。目前应用主要集中在机顶盒、 车载设备以及最常见的智能手机尤其是配备Android系统的。 例如高通的Qcomsee、 三星的Trustonic以及Google的Trusty。苹果的IOS是个特例,因为他虽然使用ARM处理器,但是不使用TrustZone。而是使用自己研发的类似于IntelSGX机制的Secure Enclave(安全飞地)来处理其安全相关的任务。
基于ARM64的服务器产品
ARM TrustZone提供的芯片级隔离的特点:
TrustZone提供了与外界完全隔离的运行环境
• 即使外部OS完全被攻破,攻击者也无法读取或篡改安全OS
• 安全世界与外部完全独立,运行自有操作系统和应用生态
• 适合用来保存关键的数据
不需要额外的硬件支持
• 利用ARM TrustZone技术,目前主流芯片均已支持
• 通过分时复用,用1个CPU实现2个CPU的功能
• 相比2个CPU: 成本更少,功耗更低,性能更好
2.3 SGX 与 TrustZone 的差异
比较SGX和TrustZone,两种安全环境还是有些不同的。主要表现为以下几点:
- SGX是Intel处理器中的可信环境, TrustZone为ARM处理器中的可信环境。两个应用场景存在不同, Intel主要为PC而ARM主要为手机、 机顶盒等小型移动设备。
- SGX的理论安全性相对于TrustZone更高,因为SGX的安全威胁处于操作系统下的硬件层,而TrustZone的安全威胁可以来自于操作系统层。
- 一个Intel CPU中可以存在多enclaves可信环境,而TrustZone不同, 只有两个环境分别为普通环境以及安全环境。
- 使用TrustZone,开发难度相对来说较小。因为其本质为将可信资源与非可信资源在硬件上实现隔离。而SGX不同,开发者需要重构代码。虽然Intel提供了SGX的SDK来协助对接,但是对接的工作量依然很大,因此由于开发造成的安全问题是SGX开发者需要面对的一个大问题。
2.4 SGX 类似技术
在区块链相关生态中,与SGX相类似的技术还有如下三个。
1. 同态加密( Homomorphic encryption)
同态加密的概念由Rivest等人在20世纪70年代首先提出,同态加密是指经过同态加密的数据进行运算得到一个结果,将结果进行解密,可以得到的与同一方法处理未加密的原始数据所得到的结果相同的密码学技术。同态加密又分加法同态、 乘法同态以及全同态加密。全同态加密直到2009年才由Graig Gentry提出。
2. 安全多方计算( multi party computation)
安全多方计算由我国唯一图灵奖得主姚期智院士提出,其提出场景为百万富翁问题暨“在没有可信第三方的前提下,两个百万富翁如何在不泄漏自己真实财产的状态下比较谁更有钱”。及多个持有私有数据的参与方,共同执行一个计算逻辑并获得计算结果。但在过程中,参与的每一方均不泄漏各自数据的计算。
3. 零知识证明( zero knowledge prove)
零知识证明,是由S.Goldwasser、 S.Micall及C.Rackoff在20世纪80年代初提出的。它指的是证明着能够在不向验证者提供任何有用的信息的情况下,是验证者相信某个论断是正确的。 去数学证明不同,零知识证明是概率证明,也就是说可能会存在小概率的误差。
3,TEE硬件隐私合约链的框架和处理流程
蚂蚁金服TEE硬件架构采用INTEL SGX硬件技术。
3.1 技术架构
TEE 合约链架构在蚂蚁区块链合约平台之上,作为核心组件提供通用高效的隐私保护能力。在蚂蚁区块链平台通用框架下,TEE 合约链利用 TEE 技术将合约引擎和必要的交易处理以及密码学运算单元集成封装在“TEE安全区”内,配合一系列严谨的安全协议流程达到隐私保护的目的。该架构充分利用蚂蚁区块链平台已有的功能特性,最大限度增加了 TEE 合约链与已有蚂蚁区块链平台的兼容性,方便用户开发使用具有隐私保护能力的区块链应用。同时最小化安全可信基,符合安全技术方案设计的原则。
下面是 TEE 合约链与蚂蚁区块链平台结合的总体框架图:
区块链的隐私保护体现在对交易全生命周期的保护,需要保护交易本身、合约代码、全局状态数据以及交易回执。
在 TEE 合约链中,交易分为隐私交易和明文交易。明文交易即无需隐私保护的交易,其执行过程与现有蚂蚁区块链平台一致;隐私交易是利用密码学技术进行保护的交易,交易内容只有在 TEE 内才安全可见,其执行过程中产生的全局状态数据以及交易回执均采用密码学技术进行加密保护。
在 TEE 合约链中,合约分为隐私合约和明文合约。隐私合约的代码和相应的数据加密存储,仅在 TEE 内部解密执行,相应的回执和状态均加密存储于外部数据库。
3.2 蚂蚁区块链合约平台和 TEE 合约链的交易处理流程
下图对比蚂蚁区块链合约平台和 TEE 合约链的交易处理流程:
注意差异点
3.3 使用场景和注意事项
交易与合约类型定义
- 明文交易 v.s. 隐私交易 明文交易指的是公开的、未启用隐私保护的区块链交易。交易内容以明文发送至区块链节点运行且明文记录;隐私交易指的是启用隐私保护的交易,交易内容加密发送至节点,在 TEE 中运行并加密记录于区块中。隐私交易默认对发送者以外的人不可见。
- 明文合约 v.s. 隐私合约 明文合约是通过明文交易部署的合约,合约执行过程中的全局状态明文存储于区块链节点本地数据库,调用接口完全开放;隐私合约是启用隐私保护的合约,通过隐私交易发起部署,合约执行过程在 TEE 中,所有的全局状态均加密存储,调用接口有限开放。
支持多种隐私操作
- 合约:隐私合约部署、隐私合约调用、保护合约调用(直接调用和代理调用均支持)、隐私合约升级。
- 查询:隐私链上数据存储查询(全局状态、交易、回执、日志)。
交易隐私
TEE 合约链支持加密交易发送,保护交易全生命周期的隐私性,包括:
- 交易在客户端完成数字信封加密,发送至节点过程中通过 SSL/TLS 信道保护,到达节点后交由 TEE 处理。
- 隐私交易进入 TEE 后进行相应的解密操作,完成必要的检查后开始执行。
- 执行完成后所有合约状态加密存储,并生成加密回执。
- 交易发送者通过客户端 SDK 提供的接口完成回执解密。
通用高效
TEE 由 CPU 硬件提供保护:
- 具有高度安全隔离和可证明特性。
- 支持通用 CPU 指令,支持各类合约虚拟机指令操作。
- 高效利用 CPU 特有指令集对包括加解密算法的操作进行通用加速。
权限控制
TEE 合约链支持用户自定义隐私权限控制:
- 合约编写者根据需求指定合约调用、查询权限保证数据隐私完全自主可控。
- 权限控制模型支持合约层面的灵活定制和无缝升级。
安全易管
金融级别的密钥管理体系——根据需求可以灵活配置和管理。
使用场景
TEE 合约链适用于以下任意场景:
- 需要隐私保护的合约逻辑复杂。
- 隐私模型本身复杂,需要灵活定制和动态更新。
- 对隐私保护有较高的性能要求。
- 隐私方案需要对开发者透明友好,不需要深入的密码学基础。
- 已有业务向隐私保护模型迁移时需要对应用层透明。
注意事项
TEE 合约链最大限度的保持了与蚂蚁区块链平台的兼容性,但不可避免的需要引入一些特殊特性来完成全生命周期的交易隐私保护。TEE 合约链提供相应的客户端 SDK,为您提供简洁一致的隐私交易构造接口。在使用 SDK 进行应用开发的过程中,需注意以下三个事项:
- 交易根密钥:用户需保管好自己的交易根密钥,且根密钥切勿随意导出分享。
- 节点 RSA 公钥:可公开下载TEE合约链节点RSA公钥,用户需下载该公钥提供给SDK相应接口用于生成隐私交易。用户可以同时下载TEE合约链的节点认证报告,通过报告中的RSA公钥哈希值确保所使用的RSA公钥的完整性。
- 隐私权限模型:TEE 合约链配合用户隐私权限模型达到隐私保护的目的。安全合理的隐私权限模型是整个隐私保护的基础,需要由用户严格定义。
4,TEE硬件隐私合约链权限控制代码示例和调试
4.1 代码
下面案例为一个订单管理类合约。在以下示例中,只有在白名单 allowedUsers 的用户才能够通过 getPrice() 函数获取隐私信息(如示例中的 currentPrice)。而白名单 allowedUsers 本身也可以通过合约的函数来进行授权管理,例如 addUser()、delUser() 等。
代码语言:javascript复制pragma solidity ^0.4.20;
//订单合约
contract Order {
mapping(identity => bool) allowedUsers; //有权限查看价格和下订单的用户
mapping(identity => uint256) orderQuantity; //用户的订单数量
uint256 currentPrice = 100; //商品当前价格
identity supplier; //商品供应商
constructor() public {
allowedUsers[msg.sender] = true;
supplier = msg.sender;
}
function addUser(identity user) public returns (bool) {
if (msg.sender == supplier) { //只有供应商可以增加权限用户
allowedUsers[user] = true;
return true;
}
return false;
}
function delUser(identity user) public returns (bool) {
if (msg.sender == supplier) { //只有供应商可以删除权限用户
allowedUsers[user] = false;
return true;
}
return false;
}
function getPrice() view public returns (bool, uint256) {
if (allowedUsers[msg.sender]) { //如果是权限用户,那么可以查看订单价格
return (true, currentPrice);
}
return (false, 0);
}
function setPrice(uint256 price) public returns (bool, uint256) {
if (msg.sender == supplier) { //如果是供应商,那么可以更改订单价格
currentPrice = price;
return (true, currentPrice);
}
return (false, 0);
}
function makeOrder(uint256 quantity) public returns (bool, uint256) {
if (allowedUsers[msg.sender]) { //如果是权限用户,那么可以下订单
orderQuantity[msg.sender] = quantity;
return (true, orderQuantity[msg.sender]);
}
return (false, 0);
}
}
SDK、Cloud IDE 及区块链浏览器支持
- C 、Java、JS 客户端 SDK 均已支持 TEE 合约链开发。各 SDK 支持的 API 参见:
- C SDK 使用说明
- Java SDK 使用说明
- JS SDK 使用说明
- Cloud IDE 已支持 TEE 合约链,方便用户在线编写、调试合约、提交加密交易,解密交易执行结果。
- 区块链浏览器已支持 TEE 合约链,用户通过区块链浏览器可以快速查看区块数据,同时对于有隐私保护的交易需要提供相应的交易密钥解密交易内容。
JS SDK跟TEE加/解密相关的函数主要有以下3个,本文先不详细讲解,在另外课程单独分析。
- decryptAESWithPassword TEE 解密方法
- decryptTXWithAES TEE 硬件隐私合约链,解密 Transaction 方法
- generateAESKey TEE 硬件隐私合约链,通过指定的 aesKey 和交易 hash 派生目标交易的最终 aes 密钥
4.3 Cloud IDE编译及调试
1,编译合约
参考《蚂蚁区块链第5课 如何配置Cloud IDE证书并进行Solidity智能合约调试?》文档,完成Order订单合约的编译。
0.代码编译成功
2,TEE加密配置
点击“TEE加密配置”按钮,在弹窗内“启动TEE加密”开关,点击“生成密钥”按钮,最后点击确定完成TEE加密配置。
1.生成AES密码
3,部署合约
2.部署合约
部署成功后,可获得其合约ID和对应的HASH值:
合约ID:0xe177463439ae372dff7ab4b62858ef8eb9f9991351096320bfe7c1a144403a2e
HASH值:0xb43f87869f191a46cb2ece445179b2ff34da9b11f4118aabc746fb0971db8cf1
3.部署成功
复制HASH值在区块链浏览器查询,可以获得:
- 浏览器查看-未输入AES私钥
可知其交易双方账号和GAS等信息都是加密的。
输入交易密钥,辉哥理解为AES密钥,结果是失败的。
5.解析失败
【问题分析】阿里专家孙善禄分析,此处应该是使用JS SDK的 Utils 里面方法:generateAESKey(aes密钥,交易hash)生成的最终aes密钥,而不是在TEE加密配置出的AES密钥。
采用浏览器,还要使用JS SDK生成的关键字,而不是有浏览器前端完成转换,有点不合理。真实情况也有待验证。
4,查询价格
点击“getPrice”查询价格,执行交易后,可知交易HASH是公开的,但是其输出output是加密的。
- getPrice交易执行
点击解密按钮,可知其结果同预期,是100。此处,CLOULD IDE做了操作,不需要用户输入最终AES密钥了。
7.解密结果
5,参考
(1)TVM如何帮助部署隐私保护和安全的AI应用
https://zhuanlan.zhihu.com/p/47613848
(2)TEEX 下一代可信计算链
https://www.chainnews.com/articles/254865546415.htm
(3)区块链技术 英特尔 SGX,构建可信数据流通环境
http://blockchain.51cto.com/art/201805/573762.htm
(4)《可信计算在区块链行业中的应用及投资逻辑》Frank 李硕淼
(5)《基于硬件的云计算平台安全架构》上海交通大学.夏虞斌
(6)TEE 合约链概述
https://tech.antfin.com/docs/2/107468
(7)TEE 硬件隐私合约链
https://tech.antfin.com/docs/2/107140