Android P 安全性更新

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

統一的指紋身份驗證對話框

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

若是您的應用使用 FingerprintManager 向用戶顯示指紋身份驗證對話框,請遷移應用的邏輯以改用 FingerprintDialog,後者依賴系統來顯示該對話框。數組

注:在應用中使用 FingerprintDialog 以前,應該先使用 hasSystemFeature() 函數以確保設備支持 FEATURE_FINGERPRINT。安全

若是設備不支持指紋身份驗證,能夠回退爲使用 createConfirmDeviceCredentialIntent() 函數驗證用戶的 PIN 碼、圖案或密碼。服務器

高可信度用戶確認

發佈時安裝有 Android P 的受支持設備賦予您使用 Protected Confirmation API 的能力。 藉助這個新增的 API,應用能夠利用 ConfirmationDialog 的實例向用戶顯示提示,請他們批准一個簡短的聲明。 應用能夠經過這個聲明再次確認,用戶確實想完成一項敏感事務,例如付款。數據結構

若是用戶接受該聲明,應用會收到由密鑰哈希消息身份驗證代碼 (HMAC) 保護的加密簽名。 該簽名由可信執行環境 (TEE) 生成,該環境會對顯示的確認對話框以及用戶輸入進行保護。 該簽名具備很高的可信度,它表示用戶已看過聲明並贊成其內容。架構

注意:Protected Confirmation API 不會爲用戶提供安全信息通道。 應用沒法承擔 Android 平臺所提供機密性保證以外的任何其餘保證。 具體地講,請勿使用該 API 顯示您一般不會顯示在用戶設備上的敏感信息。 用戶確認消息後,其完整性將獲得保證,但應用必須仍使用傳輸中數據加密來確保已簽署消息的機密性。app

要在應用中提供高可信度用戶確認,請完成如下步驟:框架

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

若是用戶批准該對話框,則會調用 onConfirmedByUser() 回調。 dataThatWasConfirmedblob 是一個 CBOR 數據結構, {: .external-link} 其中包含用戶看到的提示文本以及您傳入 ConfirmationDialog 構建器的額外數據,還包含其餘詳細信息。 應用應使用以前建立的密鑰簽署 dataThatWasConfirmed blob。 而後您應該將該 blob 連同簽名和事務詳情回傳給依賴方。

注:因爲密鑰是使用 setUserConfirmationRequired() 建立的,所以只能用於簽署以 dataThatWasConfirmed 參數形式返回的數據。函數

簽署任何其餘種類數據的嘗試不會得到成功。 收到簽名後,您的服務器應對其進行檢查。 若是簽名有效,您便可從 dataThatWasConfirmed 中提取 extraData 和 promptText,並驗證 extraData 與以前存儲的內容是否匹配。做爲最後一項檢查,服務器應檢查 promptText 是否與出如今額外數據中的事務詳情一致。若是此步驟成功,則服務器能夠執行該事務,由於它已得到高可信度的確認,用戶已看到並批准了 promptText 中的消息;

5.添加與如下代碼段所示內容相似的邏輯以顯示對話框自己:

:包含全屏對話框的確認提示界面沒法進行自定義。 但框架會爲您處理按鈕文本的本地化。

硬件安全性模塊

發佈時安裝了 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 消息。 該包裝器包含如下架構:

3. 建立一個 WrappedKeyEntry 對象以傳入字節數組形式的 ASN.1 消息;

4.將該 WrappedKeyEntry 對象傳入接受 Keystore.Entry 對象的 setEntry() 的重載。

點擊這裏前往 「Android Developers 官方文檔」 查看詳細信息

相關文章
相關標籤/搜索