本篇文章主要介绍了"android全磁盘加密",主要涉及到方面的内容,对于系统运维感兴趣的同学可以参考一下:
android 全磁盘加密 什么是全磁盘加密?全磁盘加密是使用一个密钥来为android设备上所有的用户数据加密的过程。一旦设备被加密,所有的用户创建的数据都...
如果vold在加密过程中检测到一个错误,并且如果数据还没有被解密,框架启动了,vold设置属性vold.encrypt_progress为error_not_encrypted。UI提示用户重启,并且警告他们加密过程没有开始。如果在框架卸下之后,在进度条开启之前,错误发生了,vold将会重启系统。如果重启失败,他会设置
vold.encrypt_progress为error_shutting_down,并且返回-1;但是将不会有任何事情捕获错误。这是不希望发生的。
如果vold在加密过程中检测到一个错误,他会设置 vold.encrypt_progress为
error_partially_encrypted,并且返回-1.UI应该会展示一个信息框说加密失败,并且提供一个按钮提示用户恢复出厂重置设备。
存储加密键
加密键值存储在加密元数据中。硬件支持是通过使用可信环境签名实现的。在以前,我们通过向用户密码和存储salt应用scrypt来加密主键。为了使键抵抗攻击,我们通过使用一个存储的TEE键签名一个组合键值来继承他的算法。组合签名通过一个scrypt的应用编程一个合适的密钥长度。这个密钥被使用去加密和解密主密钥。下面是存储这个密钥的过程:
- 生成随机16位的磁盘加密密钥(DEK)和16为salt。
- 向用户密码应用scrypt和salt来生成32位的中间密钥1(IK1)。
- 使用0填充IK1到硬件绑定私钥(HBK)的大小。特别的,我们填充为: 00 || IK1 || 00..00;一个0位:32 IK1 bytes, 223 zero bytes.
- 签名带有HBK的IK1来生成256位的IK2
- 将scrypt应用到IK2和salt中来生成32为IK3
- 使用IK3的前16位作为KEK,后16位作为IV
- 加密带有AES_CBS,带有密钥KEK的DEK,并且初始化向量IV
修改密码
当用户选择在设置中修改或移除密码的时候,UI发送命令cryptfs changepw到vold中,vold重新加密带有新密码的磁盘主密钥。
加密属性
vold和init通过设置属性相互交流。下面一些用于加密的可用属性。
Vold属性
属性 | 描述 |
---|
vold.decrypt trigger_encryption | 加密没有密码的设备
|
vold.decrypt trigger_default_encryption | 检查设备是否是在没有密码的情况下加密的。如果是,解密并且挂载他,如果不是,设置vold.decrypt为trigger_restart_min_framework.
|
vold.decrypt trigger_reset_main | 由vold设置关闭UI来询问磁盘密码 |
vold.decrypt trigger_post_fs_data | 由vold设置来准备带有必要目录的/data |
vold.decrypt trigger_restart_framework | 由vold设置来启动实际框架和所有服务 |
vold.decrypt trigger_shutdown_framework | 由vold设置关闭整体框架来启动加密 |
vold.decrypt trigger_restart_min_framework | 由vold设置开始进度条来加密或者是提示用户输入密码,依赖于ro.crypto.state的值 |
vold.encrypt_progress | 当框架启动的时候,如果这个属性被设置,进入进度条模式 |
vold.encrypt_progress 0 to 100 | 进度条应该会展示百分值集合。 |
vold.encrypt_progress error_partially_encrypted | 进度条应该展示一个加密失败提示信息,并且给用户一个选项来工厂重置设备。 |
vold.encrypt_progress error_reboot_failed | 进度条应该显示一个信息说加密完成,并且给用户提供一个按钮提示用户重启设备。这个错误我们不期望发生。 |
vold.encrypt_progress error_not_encrypted | 进度条应该展示一个信息框说发生了一个错误,没有数据被加密,并且给用户一个按钮提示用户重启系统。 |
vold.encrypt_progress error_shutting_down | 进度条没有运行,所以不清楚谁回应这个错误。他应该不会发生。 |
vold.post_fs_data_done 0 | 在设置vold.decrypt到trigger_post_fs_data之前 由vold设置 |
vold.post_fs_data_done 1 | 在完成任务post-fs-data之后由init.rc设置 |
init属性
属性 | 描述 |
---|
ro.crypto.fs_crypto_blkdev | 由vold命令checkpw 设置用于后面被vold命令restart使用。 |
ro.crypto.state unencrypted | 由init设置说这个系统正在用未加密的/data ro.crypto.state encrypted运行。由init设置说这个系统正在用加密的/data运行 |
ro.crypto.fs_type ro.crypto.fs_real_blkdev ro.crypto.fs_mnt_point ro.crypto.fs_options ro.crypto.fs_flags
| 在他尝试去挂载带有从 init.rc . vold中传来的参数的/data的时候, 这五个属性由init设置来设置加密映射
|
ro.crypto.tmpfs_options | 当挂载tmpfs /data文件系统的时候,由init.rc使用init应该使用的参数来设置。 |
Init行为