本文收集Android安全实现最佳方案
数据和文件存储概览
提供基本的数据安全操作,可实现沙盒隔离
| 内容类型 | 访问方法 | 所需权限 | 其他应用是否可以访问? | 卸载应用时是否移除文件? | |
|---|---|---|---|---|---|
| 应用专属文件 | 仅供您的应用使用的文件 | 从内部存储空间访问,可以使用 getFilesDir() 或 getCacheDir() 方法 从外部存储空间访问,可以使用 getExternalFilesDir() 或 getExternalCacheDir() 方法 | 从内部存储空间访问不需要任何权限 如果应用在搭载 Android 4.4(API 级别 19)或更高版本的设备上运行,从外部存储空间访问不需要任何权限 | 如果文件存储在内部存储空间中的目录内,则不能访问 如果文件存储在外部存储空间中的目录内,则可以访问 | 是 |
| 媒体 | 可共享的媒体文件(图片、音频文件、视频) | MediaStore API | 在 Android 10(API 级别 29)或更高版本中,访问其他应用的文件需要 READ_EXTERNAL_STORAGE 或 WRITE_EXTERNAL_STORAGE 权限 在 Android 9(API 级别 28)或更低版本中,访问所有文件均需要相关权限 | 是,但其他应用需要 READ_EXTERNAL_STORAGE 权限 | 否 |
| 文档和其他文件 | 其他类型的可共享内容,包括已下载的文件 | 存储访问框架 | 无 | 是,可以通过系统文件选择器访问 | 否 |
| 应用偏好设置 | 键值对 | Jetpack Preferences库 | 无 | 否 | 是 |
| 数据库 | 结构化数据 | Room持久性库 | 无 | 否 | 是 |
Security库
Security 库提供了与读取和写入静态数据以及密钥创建和验证相关的安全最佳做法的实现。
该库使用构建器模式为以下安全等级提供安全的默认设置:
- 在可靠加密和良好性能之间取得平衡的强安全性。 这种安全等级适用于银行应用和聊天应用等消费者应用,以及执行证书吊销检查的企业应用。
- 最高安全性。 这种安全等级适用于需要由硬件支持的密钥库和需要用户介入以提供密钥访问权限的应用。
密钥管理
Security 库使用一个由两部分组成的密钥管理系统:
- 包含一个或多个密钥的密钥集,用于对文件或共享偏好设置数据进行加密。密钥集本身存储在 SharedPreferences 中。
- 用于加密所有密钥集的主 ( master ) 密钥。此密钥使用 Android 密钥库系统进行存储。
参考链接:
库中包含的类
Security 库包含以下类,旨在提供更安全的静态数据机制:
提供 FileInputStream 和 FileOutputStream 的自定义实现,为您的应用赋予更安全的流式读写操作。
封装 SharedPreferences 类,并使用双重方案方法自动加密密钥和值:
-
- 密钥使用确定性加密算法进行加密,这样便可以加密并正确查找密钥。
- 值使用 AES-256 GCM 加密,并且具有不确定性。
注意:EncryptedFile 类和 EncryptedSharedPreferences 类中的方法不是线程安全的。
使用方法
developer.android.com/topic/secur…
原理图:
Android 核心密钥库系统
Android核心加密机制.可以保护密钥材料免遭未经授权的使用
安全功能
Android 密钥库系统可以保护密钥材料免遭未经授权的使用。首先,Android 密钥库可以防止从应用进程和 Android 设备中整体提取密钥材料,从而避免了在 Android 设备之外以未经授权的方式使用密钥材料。其次,Android 密钥库可以让应用指定密钥的授权使用方式,并在应用进程之外强制实施这些限制,从而避免了在 Android 设备上以未经授权的方式使用密钥材料。
提取防范
Android 密钥库密钥使用两项安全措施来避免密钥材料被提取:
- 密钥材料永不进入应用进程。通过 Android 密钥库密钥执行加密操作时,应用会在后台将待签署或验证的明文、密文和消息馈送到执行加密操作的系统进程。如果应用进程受到攻击,攻击者也许能使用应用密钥,但无法提取密钥材料(例如,在 Android 设备以外使用)。
- 您可以将密钥材料绑定至 Android 设备的安全硬件,例如可信执行环境 (TEE) 和安全元件 (SE)。为密钥启用此功能时,其密钥材料永远不会暴露于安全硬件之外。如果 Android 操作系统受到攻击或者攻击者可以读取设备内部存储空间,攻击者也许能在 Android 设备上使用任意应用的 Android 密钥库,但无法从设备上提取这些数据。只有设备的安全硬件支持密钥算法、分块模式、填充方案和密钥有权配合使用的摘要的特定组合时,才可启用此功能。要检查是否为密钥启用了此功能,请获取密钥的 KeyInfo 并检查 KeyInfo.isInsideSecurityHardware() 的返回值。
硬件安全模块
运行 Android 9(API 级别 28)或更高版本的受支持设备可拥有 StrongBox Keymaster,它是位于硬件安全模块中的 Keymaster HAL 的一种实现。该模块包含以下组成部分:
- 自己的 CPU。
- 安全存储空间。
- 真实随机数生成器。
- 可抵御软件包篡改和未经授权旁加载应用的附加机制。
检查存储在 StrongBox Keymaster 中的密钥时,系统会通过可信执行环境 (TEE) 证实密钥的完整性。
为支持低能耗的 StrongBox 实现,为一部分算法和密钥大小提供了支持:
- RSA 2048
- AES 128 和 256
- ECDSA P-256
- HMAC-SHA256(支持 8-64 字节密钥大小,含首末值)
- Triple DES 168
密钥使用授权
为了避免在 Android 设备上以未经授权的方式使用密钥,在生成或导入密钥时,Android 密钥库会让应用指定密钥的授权使用方式。一旦生成或导入密钥,其授权将无法更改。然后,每次使用密钥时,都会由 Android 密钥库强制执行授权。这是一项高级安全功能,通常仅用于有以下要求的情形:在生成/导入密钥后(而不是之前或当中),应用进程受到攻击不会导致密钥以未经授权的方式使用。
支持的密钥使用授权分为以下几类:
- 加密:授权密钥算法、运算或目的(加密、解密、签署、验证)、填充方案、分块模式以及可与密钥搭配使用的摘要;
- 时间有效性间隔:密钥获得使用授权的时间间隔;
- 用户身份验证:密钥只能在用户最近进行身份验证时使用。请参阅要求进行用户身份验证才能使用密钥。
预置秘钥方案
参考链接
developer.android.com/reference/a…
developer.android.com/training/ar…