簡體   English   中英

使用 Jetpack 的 EncryptedSharedPreferences 和 EncryptedFile 有什么好處?

[英]What are the benefits to using Jetpack's EncryptedSharedPreferences and EncryptedFile?

在閱讀了大量文章和 stackoverflow 帖子后,與使用它們的非加密對應部分相比,我找不到使用 EncryptedSharedPreferences 或 EncryptedFile 的具體理由。

首先,我想談談必須考慮安全性的設備的兩種狀態:

  • 設備沒有受到損害
  • 設備受到損害

當設備沒有受到威脅時,應用程序將被沙盒化。 只要應用程序遵循Android 的安全最佳實踐,那么應用程序就應該沒問題——安全方面。 因為在不包含設備時內部應用數據是安全的,因此無需對其進行加密。

當設備受到威脅時,應用程序幾乎無法保護自己。 唯一真正的策略是盡量減少設備上的敏感數據量。 然而,EncryptedSharedPreferences 和 EncryptedFile 似乎暗示即使設備受到威脅,它也可以保護用戶數據,正如 Android 的博客Data Encryption on Android with Jetpack Security 中所述:

為什么要加密應用程序中的數據? Android從5.0開始不就默認加密用戶數據分區的內容了嗎? 確實可以,但在某些用例中,您可能需要額外的保護……在應用程序主目錄中,如果您的應用程序處理敏感信息,包括但不限於個人身份信息 (PII),則您的應用程序應加密數據、健康記錄、財務細節或企業數據。

但是“額外的保護級別”是什么意思呢? 根據同一個博客:

在我們開始加密您的數據之前,了解如何保護您的加密密鑰的安全非常重要。 Jetpack Security 使用一個主密鑰……它生成並存儲在 AndroidKeyStore 中。

所以 Jetpack 的 EncryptedSharedPreferences 和 EncyptedFile 使用KeyStore來生成和存儲用於加密的密鑰。 這可以通過檢查源代碼來驗證。 這也是問題所在。

KeyStore並非旨在生成用於加密設備本地數據的密鑰。 作為Android 帖子的答案 - 使用硬件支持的密鑰庫與純軟件密鑰庫與無密鑰庫的實際安全優勢是什么

密鑰存儲的目的不是限制對應用程序或應用程序數據的訪問,它的目的是保護憑證在使用過程中不被暴露。 由於密鑰存儲願意利用其知識來加密數據或訪問敏感的應用程序信息,因此攻擊者利用它並不是真正的挑戰,正如您在所有三種類型的許多故障中所指出的那樣。

這意味着,在受感染的設備上,惡意程序可以使用 KeyStore 來解密所有先前加密的數據。 Android 文檔承認這一點:

如果 Android 操作系統遭到入侵或攻擊者可以讀取設備的內部存儲,則攻擊者可能能夠在 Android 設備上使用任何應用程序的 Android Keystore 密鑰,但無法從設備中提取它們。

當設備受到威脅時,這完全取消了 EncryptedSharedPreferences 和 EncryptedFile 所做的任何加密。

回顧一下:當設備沒有受到威脅時,內部應用數據是安全的。 當設備被入侵時,內部應用數據是不安全的,無論它是否通過 EncryptedSharedPreferences/EncryptedFile 加密。

問題:
如果上述情況屬實,那么使用 EncryptedSharedPreferences 和 EncryptedFile 有什么好處? 與未加密的對應項相比,是否存在 EncryptedSharedPreferences 和 EncryptedFile 可以保護內部應用程序數據的特定場景?

編輯1:
正如評論中所指出的,“內部應用數據”是模棱兩可的。 具體來說,我指的是/data/data/<package name>的位置,它受到應用沙盒憑據加密的保護。 另外,就這個問題而言,我想關注 Android 10+,因為這是需要 FBE 的時候。 但是,我也對較低 Android 版本的場景感興趣(在撰寫本文時,EncryptedSharedPreferences/EncryptedFile 的最低 API 級別為 21)。

編輯2:
重新閱讀問題后,我認為在這里明確 KeyStore什么也很重要。 KeyStore 由 2 個主要部分組成:一個物理組件(例如 TEE、SoC、HSM)和一個操作系統守護程序。 物理組件是代表操作系統執行加密操作的東西,因此沒有進程(包括操作系統)可以知道密鑰是什么。 操作系統守護進程是限制物理組件使用的東西。 由於操作系統守護程序限制使用,惡意程序(在受感染的設備上)可以繞過這些限制並直接使用物理組件。 這就是為什么不應該使用 KeyStore 來加密設備本地的數據的原因。 物理組件只提供密鑰本身不會被攻擊者知道的屬性,而不是不能被他們使用的屬性。 有關 KeyStore 的更多信息,請參見此處此處

如果設備受到威脅,整個系統的安全性就會受到質疑,所有數據都可能被視為暴露。 如果設備沒有受到威脅,操作系統本身應該保證應用程序、數據和執行環境的安全。

我將詳細說明另一種狀態,該設備由第三方分析,在許多情況下處於離線模式 - 可能是執法主體或小偷。

根據文檔EncryptedSharedPreferences ,首選項文件已加密,因此可以保護靜態數據。 這種安全級別獨立於設備的其他安全方面(可選的 FDE 或 SD 卡加密),並且可由應用程序開發人員管理。 使用 Android KeyStore 應該允許通過標准和穩定的 API 使用 Android 安全功能(例如 HSM)。

回答

... 使用 EncryptedSharedPreferences 和 EncryptedFile 有什么好處?

應用程序開發人員可以通過標准 API 確保應用程序數據的某些安全級別。

與未加密的對應項相比,是否存在 EncryptedSharedPreferences 和 EncryptedFile 可以保護內部應用程序數據的特定場景?

是的,在對設備(或存儲)進行惡意或離線攻擊期間,EncryptedSharedPreferences/EncryptedFile 可以為應用程序數據提供保護,或者至少將獲取此類數據所需的標准提高到非平凡的水平。

根據我在這部分的知識和經驗。

EncryptedSharedPreferences即使在有根設備中也能保護用戶數據。

當您在實現中創建 SharedPreferences 對象時,會在名為shared_pref的目錄中創建一個文件,該文件將包含您在代碼實現中傳遞的文件名。

這個shared_pref文件夾位於 data/data/your package name。

如果設備有根,則可以訪問此目錄,因此可以利用其中的數據。

首選項文件很容易閱讀,因為它是一個映射文件,其鍵和值如下所示:

在此處輸入圖像描述

同時,如果您使用EncryptedSharedPrefences ,則默認情況下您的密鑰和值是加密的,因此即使設備是 root 也無法利用數據。

如下所示:

在此處輸入圖像描述

如果您需要檢查您的sharedPref文件,您可以從 Android Studio 進行

  1. 打開安卓工作室
  2. 在模擬器上運行您的應用程序
  3. 在設備文件資源管理器上(Android Studio 的右下角)
  4. 在 data/data 目錄中找到你的包名。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM