本篇文章主要介绍了"android全磁盘加密",主要涉及到方面的内容,对于系统运维感兴趣的同学可以参考一下:
android 全磁盘加密 什么是全磁盘加密?全磁盘加密是使用一个密钥来为android设备上所有的用户数据加密的过程。一旦设备被加密,所有的用户创建的数据都...
android 全磁盘加密
什么是全磁盘加密?
全磁盘加密是使用一个密钥来为android设备上所有的用户数据加密的过程。一旦设备被加密,所有的用户创建的数据都将会在提交的磁盘之前自动加密,在读取之前都会自动解密。
Android 5.0中添加了啥
- 创建了快速加密,该加密方式仅仅加密在数据分区中使用块设备的数据来避免第一次启动耗费较长时间。仅仅ext4和f2fs文件系统支持快速加密。
- 在首次启动的时候添加forceencrypt标志来加密
- 增加了对模式的支持和没有密码的加密
- 增加使用可信执行环境的密钥的硬件支持存储。
注意:升级到Android5.0并且被加密的设备可能会数据恢复出厂后返回一个未加密状态。在首次启动时加密的新的Android 5.0设备不能返回到未加密状态。
Android全磁盘加密是如何工作的
Android全磁盘加密基于dm-crypy,他是一个内核特征,工作在块设备层。出于这个原因,加密是和嵌入式多媒体卡和作为块设备的闪存设备一起工作的。在YAFFS文件系统中,加密是不可能工作的,他是直接和NAND闪存芯片工作的。
加密算法是带有CBC和 ESSIV:SHA256的128高级加密标准。主键是通过128位AES通过OpenSSL库被加密的。你必须要使用128位或更大位数的键值。
注意:OEMs能够使用128位或更高位数来加密主键。
在Android5.0的发行版中,有四种加密状态:
在第一次启动的时候,设备创建一个随机生成的128位主键,然后使用默认密码和存储的salt进行哈希运算。默认密码是”default_password”。然而,结果散列也需要通过TEE进行签名,他使用一个签名的散列来加密主键。
你可以在Android源码文件cryptfs.c中找到默认密码。
当用户在设备中设置了PIN或者是密码,仅仅128位的键被重新加密和存储。(用户PIN/密码/模式的改变不会造成用户数据重新加密)。注意管理的设备可能会受到PIN,模式或密码的限制。
加密是由init和vold管理的。init调用vold,vold设置位于init中的属性来触发事件。系统的其他部分也会根据这些属性来进行工作,例如报告状态,查询密码,或者是发生致命错误的时候及时工厂重置。为了在vold中激活加密特征,系统使用命令行工具vdc
’s cryptfs运行命令:
checkpw
, restart
, enablecrypto
, changepw
, cryptocomplete
, verifypw
,setfield
, getfield
, mountdefaultencrypted
, getpwtype
, getpw
, 和clearpw
.
为了进行加密,解密或清除/data,/data必须要被挂载。然而,为了能够显示用户接口,框架一定要运行并且框架需要/data来运行。为了解决这个难题,在/data中会挂载一个临时的文件系统。这使得安卓能够提示密码,显示进展,或在需要的时候进行数据擦除。在从临时文件系统到真实的/data文件系统的转换的时候强加了一些限制,系统必须要停止打开临时文件系统中文件的每一个进程,然后在真实的/data文件系统中重启这些进程。为了这样做,所有的服务都必须在这三个组中的一个中:core,main和late_start。