SGX入门

如何设计SGX程序:

SGX分为可信部分和不可信部分,可信部分由enclave组成(一个应用程序可以拥有一个或多个enclave),enclave存储在加密的内存中,受SGX保护,enclave一旦被建立就不能更改,所以通常认为是可信的,如果被恶意篡改那么enclave便不会加载。非可信部分指不受SGX保护的内存和应用程序。
设计一个SGX程序要求将代码分成不同部分,首先应判断哪些代码应该放到enclave,哪些不用,以及他们之间的交互。

1.确定机密信息。机密信息指不希望除处理它的程序外被看到的信息。
2.确定机密信息的提供者和使用者。
在这里插入图片描述
3.确立enclave边界(要尽可能多的包含机密数据,并减少与非信任代码的交互)
但是包含太多非机密数据也不行。。会造成很多资源浪费~
在这里插入图片描述
4.精简enclave中的代码(两个原则)
在这里插入图片描述
enclave的体积应该尽可能小,并且在机密信息不需要使用后需要及时销毁这部分enclave
在这里插入图片描述
尽量用更少的调用完成更多的工作

安全区定义语言——EDL(Enclave Defination Language)

SGX提供的最基本的保护措施:enclave中的机密信息能且仅能被enclave中的代码访问,而执行enclave中的代码的唯一方式就是通过开发人员创建的接口函数(这是由CPU保障的,即使特权用户也必须遵守)
每个enclave可以定义一个或多个E-CALL(Enclave call)和O-CALL。E-CALL是非可信应用程序进入enclave的入口。O-CALL使得安全区函数可以调用安全区外的应用程序(非可信),再返回到安全区中。E-CALL和O-CALL共同组成安全区的接口。但是这些接口函数并非直接由非可信应用程序执行(对enclave入口和出口的访问直接由CPU严格控制)。要完成转换,必须按顺序执行特定的CPU指令。

SGX SDK把这些底层细节做了抽象,Edger8r可以自动为开发者的E-CALL和O-CALL生成代理函数,开发者可以像调用C语言函数一样调用代理函数。
Edger8r从EDL文件中读取安全区接口的定义(以创建代理函数)
EDL文件和C语言的头文件风格类似,语法上也类似。
在这里插入图片描述
E-CALL定义在可信区,O-CALL定义在非可信区
所有能被非可信程序调用的E-CALL必须声明为public,每个安全区至少有一个public的E-CALL,不含public关键字的E-CALL只能被O-CALL执行。当E-CALL或O-CALL被调用时,函数参数在可信内存和非可信内存间封装传送,定义E-CALL或O-CALL时需要严格定义参数的传递方向和个数

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值