Android P 安全性更新

Android_開發者發表於2019-03-04

Android P 引入了若干可提升應用和執行應用的裝置安全性的功能。 本頁面介紹對第三方應用開發者最重要的變化,需要他們牢記在心。

統一的指紋身份驗證對話方塊

在 Android P 中,系統代表應用提供指紋身份驗證對話方塊。 此功能會建立標準化的對話方塊外觀、風格和位置,讓使用者可以更放心地確信,他們是在根據可信的指紋憑據檢查程式驗證身份。

如果您的應用使用 FingerprintManager 向使用者顯示指紋身份驗證對話方塊,請遷移應用的邏輯以改用 FingerprintDialog,後者依賴系統來顯示該對話方塊。

注:在應用中使用 FingerprintDialog 之前,應該先使用 hasSystemFeature() 函式以確保裝置支援 FEATURE_FINGERPRINT。

如果裝置不支援指紋身份驗證,可以回退為使用 createConfirmDeviceCredentialIntent() 函式驗證使用者的 PIN 碼、圖案或密碼。

高可信度使用者確認

釋出時安裝有 Android P 的受支援裝置賦予您使用 Protected Confirmation API 的能力。 藉助這個新增的 API,應用可以利用 ConfirmationDialog 的例項向使用者顯示提示,請他們批准一個簡短的宣告。 應用可以通過這個宣告再次確認,使用者確實想完成一項敏感事務,例如付款。

如果使用者接受該宣告,應用會收到由金鑰雜湊訊息身份驗證程式碼 (HMAC) 保護的加密簽名。 該簽名由可信執行環境 (TEE) 生成,該環境會對顯示的確認對話方塊以及使用者輸入進行保護。 該簽名具有很高的可信度,它表示使用者已看過宣告並同意其內容。

注意:Protected Confirmation API 不會為使用者提供安全資訊通道。 應用無法承擔 Android 平臺所提供機密性保證之外的任何其他保證。 具體地講,請勿使用該 API 顯示您通常不會顯示在使用者裝置上的敏感資訊。
使用者確認訊息後,其完整性將得到保證,但應用必須仍使用傳輸中資料加密來確保已簽署訊息的機密性。

要在應用中提供高可信度使用者確認,請完成以下步驟:

  1. 使用 KeyGenParameterSpec.Builder 類生成一個非對稱簽名金鑰。 建立該金鑰時,將 true傳入 setUserConfirmationRequired()。 此外,呼叫 setAttestationChallenge() 以傳遞由依賴方提供的合適私鑰保護值;
  2. 向相應的依賴方登記新生成的金鑰和金鑰的認證證書;
  3. 將事務詳情傳送至伺服器,並讓其生成並返回一個額外資料 blob。 例如,一項金融事務的額外資料可能包括金額、來源帳戶和目標帳戶。 該 blob 應包含加密隨機數以防範重播攻擊 {: .external-link},並且該 blob 還可包含應用特有資料。 伺服器應將該 blob 和事務詳情儲存在本地;
  4. 設定 ConfirmationCallback 物件,讓它在使用者已接受確認對話方塊中顯示的提示時通知應用:
Android P 安全性更新

如果使用者批准該對話方塊,則會呼叫 onConfirmedByUser() 回撥。 dataThatWasConfirmedblob 是一個 CBOR 資料結構, {: .external-link} 其中包含使用者看到的提示文字以及您傳入 ConfirmationDialog 構建器的額外資料,還包含其他詳細資訊。 應用應使用之前建立的金鑰簽署 dataThatWasConfirmed blob。 然後您應該將該 blob 連同簽名和事務詳情回傳給依賴方。

注:由於金鑰是使用 setUserConfirmationRequired() 建立的,因此只能用於簽署以 dataThatWasConfirmed 引數形式返回的資料。

簽署任何其他種類資料的嘗試不會獲得成功。 收到簽名後,您的伺服器應對其進行檢查。 如果簽名有效,您即可從 dataThatWasConfirmed 中提取 extraData 和 promptText,並驗證 extraData 與之前儲存的內容是否匹配。作為最後一項檢查,伺服器應檢查 promptText 是否與出現在額外資料中的事務詳情一致。如果此步驟成功,則伺服器可以執行該事務,因為它已獲得高可信度的確認,使用者已看到並批准了 promptText 中的訊息;

5.新增與以下程式碼段所示內容類似的邏輯以顯示對話方塊本身:

Android P 安全性更新

:包含全屏對話方塊的確認提示介面無法進行自定義。 但框架會為您處理按鈕文字的本地化。

硬體安全性模組

釋出時安裝了 Android P 的受支援裝置可擁有 StrongBox Keymaster,這個 Keymaster HAL 的實現位於一個硬體安全性模組內。 該模組包含自己的 CPU、安全儲存空間、真實隨機數生成器以及抵禦軟體包篡改和未經授權線刷應用的附加機制。 檢查儲存在 StrongBox Keymaster 中的金鑰時,系統會通過可信執行環境 (TEE) 證實金鑰的完整性。

為支援低能耗的 StrongBox 實現,為一部分演算法和金鑰長度提供了支援:

  • RSA 2048
  • AES 128 和 256
  • ECDSA P-256
  • HMAC-SHA256 (支援 8-64 位元組金鑰長度,含首末值)
  • Triple DES 168

使用 KeyStore 類生成或匯入金鑰時,您需要通過將 true 傳遞給 KeyGenParameterSpec.Builder類或 KeyProtection.Builder 類中的 setIsStrongBoxBacked() 函式,指示在 StrongBox Keymaster 中儲存金鑰的偏好。

注:如果 StrongBox Keymaster 不可用於特定演算法和與金鑰關聯的金鑰長度,框架會引發一個 StrongBoxUnavailableException。

保護對金鑰庫進行的金鑰匯入

Android P 增加了金鑰加密的安全性,新增了利用新增的 ASN.1 編碼金鑰格式將已加密金鑰安全匯入金鑰庫的功能。 Keymaster 隨後會在金鑰庫中將金鑰解密,因此金鑰的內容永遠不會以明文形式出現在裝置的主機記憶體中。

注:只有附帶 Keymaster 4 的新釋出裝置支援此功能。

要支援以安全方式將已加密金鑰匯入金鑰庫,請完成以下步驟:

  1. 生成一個使用 PURPOSE_WRAP_KEY 目的的金鑰對。 建議也為該金鑰對新增認證;
  2. 在您信任的伺服器或機器上,生成 SecureKeyWrapper 應包含的 ASN.1 訊息。
    該包裝器包含以下架構:
Android P 安全性更新

3. 建立一個 WrappedKeyEntry 物件以傳入位元組陣列形式的 ASN.1 訊息;

4.將該 WrappedKeyEntry 物件傳入接受 Keystore.Entry 物件的 setEntry() 的過載。

點選這裡前往 “Android Developers 官方文件” 檢視詳細資訊

Android P 安全性更新

相關文章