支持“Direct boot”模式
当设备已开机但用户尚未解锁设备时,Android 7.0 将在安全的“直接启动”模式下运行。为支持此模式,系统为数据提供了两个存储位置:
- 凭据加密存储(Credential encrypted storage),这是默认存储位置,仅在用户解锁设备后可用。
- 设备加密存储(Device encrypted storage ),该存储位置在“直接启动”模式下和用户解锁设备后均可使用。
默认情况下,应用不会在“Direct boot”模式下运行。如果您的应用需要在“直接启动”模式下执行操作,您可以注册应在此模式下运行的应用组件。需要在“直接启动”模式下运行的一些常见应用用例包括: - 已安排通知的应用,如闹钟应用。
- 提供重要用户通知的应用,如短信应用。
- 提供无障碍服务的应用,如 Talkback。
如果应用在“Direct boot”模式下运行时需要访问数据,请使用设备加密存储。设备加密存储包含使用密钥加密的数据,该密钥只有在设备成功执行启动时验证后才可用。
对于应使用与用户凭据(如 PIN 码或密码)关联的密钥加密的数据,请使用凭据加密存储。凭据加密存储仅在用户成功解锁设备后可用,直到用户再次重启设备。如果用户在解锁设备后启用锁定屏幕,则不会锁定凭据加密存储。
请求在“Direct boot”模式下运行
应用必须先向系统注册其组件,然后才能在“Direct boot"模式下运行或访问设备加密存储。应用通过将组件标记为加密感知来向系统注册。如需将您的组件标记为加密感知,请在清单中将 android:directBootAware
属性设为 true。
当设备重启后,加密感知组件可以注册以接收来自系统的 ACTION_LOCKED_BOOT_COMPLETED 广播消息。此时,设备加密存储可用,您的组件可以执行需要在“直接启动”模式下运行的任务,在用户解锁设备后,所有组件均可访问设备加密存储和凭据加密存储。
访问设备加密存储
如需访问设备加密存储,请通过调用 Context.createDeviceProtectedStorageContext() 创建另一个 Context 实例。通过此上下文发出的所有存储 API 调用均访问设备加密存储。以下示例会访问设备加密存储并打开现有的应用数据文件:
Context directBootContext = appContext.createDeviceProtectedStorageContext();
// Access appDataFilename that lives in device encrypted storage
FileInputStream inStream = directBootContext.openFileInput(appDataFilename);
// Use inStream to read content...
SharedPreferences recordSavePreferences = directBootContext.getSharedPreferences(preferencesFilename, MODE_PRIVATE);
// Use SharedPreferences
new DatabaseHelper(directBootContext);
// Use database
Cursor cursor = directBootContext.getContentResolver().query(CONTENT_URI, QUERY_COLUMNS, selection, selectionArgs, null);
// Database query
请只将设备加密存储用于在“Direct boot”模式下必须可以访问的信息。请勿将设备加密存储用作通用加密存储。对于私密用户信息,或在"Direct boot”模式下不需要的加密数据,请使用凭据加密存储。
文件加密方式
- DE(device encrypted)
文件会被一个密钥进行加密,这个密钥仅在系统执行了可验证的启动后才能获得。
在系统中,只有一个DEsys的key,有多个DEn的key对于每一个用户 - CE(credential encrypted)
文件加密使用一个和用户认证(PIN,图案,密码)关联的key,这个key只有用户先执行了认证后才能获取
每一个用户拥有一个ce key - NE(none encrypted)
文件不加密,这种情况十分少见,而OTA更新文件是个例子