Google is committed to advancing racial equity for Black communities. See how.
本頁面由 Cloud Translation API 翻譯而成。
Switch to English

硬件支持的密鑰庫

片上系統(SoC)中受信任的執行環境的可用性為Android設備提供了向Android OS,平台服務甚至第三方應用程序提供硬件支持的強大安全服務的機會。尋求Android特定擴展的開發人員應轉到android.security.keystore

在Android 6.0之前,Android已經有一個簡單的,由硬件支持的加密服務API,由Keymaster硬件抽象層(HAL)的0.2和0.3版本提供。 Keystore提供了數字簽名和驗證操作,以及生成和導入非對稱簽名密鑰對。這已經在許多設備上實現,但是有許多安全目標,僅使用簽名API很難實現。 Android 6.0中的Keystore擴展了Keystore API,以提供更廣泛的功能。

在Android 6.0中,Keystore添加了對稱加密原語 ,AES和HMAC以及用於硬件支持的密鑰的訪問控制系統。訪問控制是在密鑰生成期間指定的,並在密鑰的生命週期內強制執行。可以將密鑰限制為僅在用戶經過身份驗證之後才可用,並且只能用於指定目的或具有指定的加密參數。有關更多信息,請參見授權標籤功能頁面。

除了擴大加密原語的範圍外,Android 6.0中的Keystore還添加了以下內容:

  • 一種使用控制方案,用於限制密鑰使用,以減輕由於濫用密鑰而造成的安全風險
  • 一種訪問控制方案,用於將密鑰限制為指定的用戶,客戶端和定義的時間範圍

在Android 7.0中,Keymaster 2添加了對密鑰證明和版本綁定的支持。 密鑰證明提供了公開密鑰證書,其中包含對密鑰及其訪問控制的詳細描述,以使密鑰在安全硬件中的存在及其配置可以遠程驗證。

版本綁定將密鑰綁定到操作系統和補丁程序級別的版本。這樣可以確保發現舊系統或TEE軟件漏洞的攻擊者無法將設備回滾到易受攻擊的版本,也無法使用由較新版本創建的密鑰。此外,如果在已升級到較新版本或補丁程序級別的設備上使用具有給定版本和補丁程序級別的密鑰,則在使用該密鑰之前先對其進行升級,並且該密鑰的先前版本無效。隨著設備的升級,密鑰會與設備一起“棘輪”前進,但是如果將設備還原到先前的發行版,則會導緻密鑰無法使用。

在Android 8.0中,Keymaster 3從舊式的C結構硬件抽象層(HAL)過渡到根據新的硬件接口定義語言(HIDL)中的定義生成的C ++ HAL接口。作為更改的一部分,許多參數類型發生了變化,儘管類型和方法與舊類型和HAL struct方法具有一一對應的關係。有關更多詳細信息,請參見“ 功能”頁面。

除了此界面修訂版之外,Android 8.0擴展了Keymaster 2的證明功能以支持ID證明 。 ID證明提供了一種有限的和可選的機制,可以對硬件標識符(例如設備序列號,產品名稱和電話ID(IMEI / MEID))進行強有力的證明。要實現此添加,請更改ASN.1認證架構以添加ID認證。 Keymaster的實現需要找到某種安全的方法來檢索相關的數據項,以及定義一種用於安全且永久禁用該功能的機制。

在Android 9中,更新包括:

  • 更新至Keymaster 4
  • 支持嵌入式安全元素
  • 支持安全密鑰導入
  • 支持3DES加密
  • 更改版本綁定,以便boot.img和system.img分別設置版本以允許獨立更新

詞彙表

這是Keystore組件及其關係的快速概述。

AndroidKeystore是Android Framework API和應用程序用來訪問Keystore功能的組件。它是對標準Java密碼體系結構API的擴展,由在應用程序自己的處理空間中運行的Java代碼組成。 AndroidKeystore通過將其轉發到keystore守護程序來滿足應用程序對Keystore行為的請求。

密鑰庫守護程序是一個Android系統守護程序,可通過Binder API訪問所有密鑰庫功能。它負責存儲“密鑰斑點”,其中包含實際的密鑰材料,並對其進行了加密,因此密鑰庫可以存儲它,但不能使用它或將其顯示出來。

keymasterd是提供訪問Keymaster TA的HIDL服務器。 (此名稱不是標準化的,僅供參考。)

Keymaster TA (受信任的應用程序)是在安全上下文中運行的軟件,通常在ARM SoC上的TrustZone中運行,它提供所有安全的Keystore操作,可以訪問原始密鑰材料,驗證密鑰上的所有訪問控制條件等

LockSettingsService是負責用戶身份驗證(包括密碼和指紋)的Android系統組件。它不是密鑰庫的一部分,而是相關的,因為許多密鑰庫密鑰操作需要用戶身份驗證。 LockSettingsService與Gatekeeper TA和Fingerprint TA進行交互以獲得身份驗證令牌,該令牌提供給Keystore守護程序,並最終由Keymaster TA應用程序使用。

Gatekeeper TA (受信任的應用程序)是在安全上下文中運行的另一個組件,它負責對用戶密碼進行身份驗證並生成用於向Keymaster TA證明針對特定用戶在特定時間點進行了身份驗證的身份驗證令牌。

指紋TA (受信任的應用程序)是在安全上下文中運行的另一個組件,它負責對用戶指紋進行身份驗證並生成用於向Keymaster TA證明已在特定時間對特定用戶進行了身份驗證的身份驗證令牌。

建築

Android Keystore API和底層的Keymaster HAL提供了一組基本但足夠的加密原語,以允許使用訪問控制的,硬件支持的密鑰來實現協議。

Keymaster HAL是OEM提供的,可動態加載的庫,供Keystore服務用於提供硬件支持的加密服務。為了確保安全,HAL實現不對用戶空間甚至內核空間執行任何敏感操作。敏感操作被委派給通過某些內核接口訪問的安全處理器。產生的架構如下所示:

訪問Keymaster

圖1.訪問Keymaster

在Android設備中,Keymaster HAL的“客戶端”由多個層(例如,應用程序,框架,Keystore守護程序)組成,但是出於本文檔的目的,可以將其忽略。這意味著所描述的Keymaster HAL API是低級的,由平台內部組件使用,並且不向應用程序開發人員公開。更高級別的API在Android Developer網站上進行了描述。

Keymaster HAL的目的不是實現對安全敏感的算法,而只是將對安全世界的請求編組和解組。接線格式是實現定義的。

與以前版本的兼容性

Keymaster 1 HAL與先前發布的HAL完全不兼容,例如Keymaster 0.2和0.3。為了促進與較舊的Keymaster HAL一起啟動的運行Android 5.0及更低版本的設備上的互操作性,Keystore提供了一個適配器,該適配器通過調用現有硬件庫來實現Keymaster 1 HAL。結果不能提供Keymaster 1 HAL中的全部功能。特別是,它僅支持RSA和ECDSA算法,並且在非安全環境中,所有密鑰授權實施都由適配器執行。

Keymaster 2通過刪除get_supported_*方法並允許finish()方法接受輸入,進一步簡化了HAL接口。在輸入一次全部可用的情況下,這減少了到TEE的往返次數,並簡化了AEAD解密的實現。

在Android 8.0中,Keymaster 3從舊式的C結構HAL過渡到了由新的硬件接口定義語言(HIDL)中的定義生成的C ++ HAL接口。通過子類化生成的IKeymasterDevice類並實現純虛擬方法,可以創建一種新型的HAL實現。作為更改的一部分,儘管類型和方法與舊類型和HAL struct方法一一對應,但許多參數類型也已更改。

HIDL概述

硬件接口定義語言(HIDL)提供了獨立於實現語言的機制來指定硬件接口。 HIDL工具當前支持C ++和Java接口的生成。預計大多數受信任的執行環境(TEE)實施者會發現C ++工具更加方便,因此本文檔僅討論C ++表示形式。

HIDL接口包含一組方法,表示為:

  methodName(INPUT ARGUMENTS) generates (RESULT ARGUMENTS);

有各種預定義的類型,HAL可以定義新的枚舉和結構類型。有關HIDL的更多詳細信息,請參見參考部分

Keymaster 3 IKeymasterDevice.hal的示例方法是:

generateKey(vec<KeyParameter> keyParams)
        generates(ErrorCode error, vec<uint8_t> keyBlob,
                  KeyCharacteristics keyCharacteristics);

這等效於keymaster2 HAL中的以下內容:

keymaster_error_t (*generate_key)(
        const struct keymaster2_device* dev,
        const keymaster_key_param_set_t* params,
        keymaster_key_blob_t* key_blob,
        keymaster_key_characteristics_t* characteristics);

在HIDL版本中,刪除了dev參數,因為它是隱式的。 params參數不再是包含引用key_parameter_tkey_parameter_t數組的指針的結構,而是包含KeyParameter對象的vec (向量)。返回值在“ generates ”子句中列出,包括密鑰blob的uint8_t值向量。

HIDL編譯器生成的C ++虛擬方法是:

Return<void> generateKey(const hidl_vec<KeyParameter>& keyParams,
                         generateKey_cb _hidl_cb) override;

其中generate_cb是定義為的函數指針:

std::function<void(ErrorCode error, const hidl_vec<uint8_t>& keyBlob,
                   const KeyCharacteristics& keyCharacteristics)>

也就是說, generate_cb是一個使用generate子句中列出的返回值的函數。 HAL實現類重寫此generateKey方法,並調用generate_cb函數指針,以將操作結果返回給調用者。注意,函數指針的調用是同步的 。調用者調用generateKeygenerateKey調用提供的函數指針,該指針執行完成,將控制權返回generateKey實現,然後返回給調用者。

有關詳細示例,請參閱hardware/interfaces/keymaster/3.0/default/KeymasterDevice.cpp 。默認實現為具有舊式keymaster0,keymaster1或keymaster2 HALS的設備提供向後兼容性。