英特爾 SGX(Intel Software Guard Extension)是英特爾指令集架構的一個擴充套件。SGX 為您提供了圍圈(Enclave),即記憶體中一個加密的可信執行區域,由 CPU 保護您的資料和隱私不被惡意程式碼竊取。
原理
SGX 利用新增的處理器指令,在記憶體中分配一部分割槽域 EPC(Enclave Page Cache),透過 CPU 內的加密引擎 MEE(Memory Encryption Engine)對其中的資料進行加密。EPC 中加密的內容只有進入 CPU 後才會被解密成明文。因此,在 SGX 中,您可以不信任作業系統、VMM、甚至 BIOS,只需要信任 CPU 便能確保隱私資料不會洩漏。
應用
實際應用中,您可以把隱私資料加密後以密文形式傳遞至雲上的圍圈中,並透過遠端證明把對應的秘鑰也傳入圍圈。然後在 CPU 的加密保護下利用資料進行運算,結果會以密文形式返回給您。這種模式下,您既可以利用雲計算強大的計算力,又不用擔心資料洩漏
EDL(Enclave Definition Language)
EDL 是 SGX 程式設計的核心,其中定義了所有圍圈裡對外讀寫、處理資料的函式。在編譯階段,SDK 提供的 Edger8r 工具會根據 EDL 中定義的函式生成圍圈和普通記憶體的橋接函式,並做相應的安全檢測。
函式分為信任函式(ecall)和不可信函式(ocall):
ecall:定義在信任區域(trusted),在圍圈外被呼叫,並在圍圈內執行。
ocall:定義在不可信區域(untrusted),在圍圈內被呼叫,並在圍圈外執行。
// demo.edl
enclave {
// Add your definition of "secret_t" here
trusted {
public void get_secret([out] secret_t* secret);
};
untrusted {
// This OCALL is for illustration purposes only.
// It should not be used in a real enclave,
// unless it is during the development phase
// for debugging purposes.
void dump_secret([in] const secret_t* secret);
英特爾 SGX(Intel Software Guard Extension)是英特爾指令集架構的一個擴充套件。SGX 為您提供了圍圈(Enclave),即記憶體中一個加密的可信執行區域,由 CPU 保護您的資料和隱私不被惡意程式碼竊取。
原理
SGX 利用新增的處理器指令,在記憶體中分配一部分割槽域 EPC(Enclave Page Cache),透過 CPU 內的加密引擎 MEE(Memory Encryption Engine)對其中的資料進行加密。EPC 中加密的內容只有進入 CPU 後才會被解密成明文。因此,在 SGX 中,您可以不信任作業系統、VMM、甚至 BIOS,只需要信任 CPU 便能確保隱私資料不會洩漏。
應用
實際應用中,您可以把隱私資料加密後以密文形式傳遞至雲上的圍圈中,並透過遠端證明把對應的秘鑰也傳入圍圈。然後在 CPU 的加密保護下利用資料進行運算,結果會以密文形式返回給您。這種模式下,您既可以利用雲計算強大的計算力,又不用擔心資料洩漏
EDL(Enclave Definition Language)
EDL 是 SGX 程式設計的核心,其中定義了所有圍圈裡對外讀寫、處理資料的函式。在編譯階段,SDK 提供的 Edger8r 工具會根據 EDL 中定義的函式生成圍圈和普通記憶體的橋接函式,並做相應的安全檢測。
函式分為信任函式(ecall)和不可信函式(ocall):
ecall:定義在信任區域(trusted),在圍圈外被呼叫,並在圍圈內執行。
ocall:定義在不可信區域(untrusted),在圍圈內被呼叫,並在圍圈外執行。
// demo.edl
enclave {
// Add your definition of "secret_t" here
trusted {
public void get_secret([out] secret_t* secret);
};
untrusted {
// This OCALL is for illustration purposes only.
// It should not be used in a real enclave,
// unless it is during the development phase
// for debugging purposes.
void dump_secret([in] const secret_t* secret);
};
};