ASP源码.NET源码PHP源码JSP源码JAVA源码DELPHI源码PB源码VC源码VB源码Android源码
当前位置:首页 >> 系统运维 >> android全磁盘加密

android全磁盘加密(6/7)

来源:网络整理     时间:2016-02-23     关键词:

本篇文章主要介绍了"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的应用编程一个合适的密钥长度。这个密钥被使用去加密和解密主密钥。下面是存储这个密钥的过程:

  1. 生成随机16位的磁盘加密密钥(DEK)和16为salt。
  2. 向用户密码应用scrypt和salt来生成32位的中间密钥1(IK1)。
  3. 使用0填充IK1到硬件绑定私钥(HBK)的大小。特别的,我们填充为: 00 || IK1 || 00..00;一个0位:32 IK1 bytes, 223 zero bytes.
  4. 签名带有HBK的IK1来生成256位的IK2
  5. 将scrypt应用到IK2和salt中来生成32为IK3
  6. 使用IK3的前16位作为KEK,后16位作为IV
  7. 加密带有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.rcvold中传来的参数的/data的时候,这五个属性由init设置来设置加密映射
ro.crypto.tmpfs_options当挂载tmpfs /data文件系统的时候,由init.rc使用init应该使用的参数来设置。

Init行为

相关图片

相关文章