原生安卓给sd卡加密 安卓设备数据存储安全研究之安卓全磁盘加密技术解读)

  2023-07-29 05:02:36

hello大家好,我是城乡经济网小晟来为大家解答以上问题,原生安卓给sd卡加密,安卓设备数据存储安全研究之安卓全磁盘加密技术解读)很多人还不知道,现在让我们一起来看看吧!


(资料图片)

2007年,谷歌公司发布基于Linux系统内核的开源智能手机操作系统“安卓(Android)”。经过近八年的发展,安卓系统已经从最初的智能手机领域进入汽车、教育、电视、平板电脑等行业。根据市场研究公司Strategy Analytics(SA)最新的报告,2014年智能手机总出货量为13亿台,其中安卓系统占有率达81.2%。

尽管安卓设备用户的数量庞大,其安全意识却有待增强。美国在年度《消费者报告》(Consumer Reports)中指出,在美国有近40%的手机用户没有采取适当的安全措施。同时,用户个人数据泄露问题也日益突出:手机丢失或被窃导致手机上存储的个人信息泄露;用户淘汰旧手机时,即使删除全部数据,手机中的部分数据也可以恢复;恶意软件利用系统漏洞也可能非法获取用户的个人数据。

为提高数据存储的安全性,谷歌从Android 3.0开始,在安卓系统上提供了可选的磁盘加密解决方案,但由于加密性能等原因,并未被普遍采用。2015年9月底发布的Android 6.0中,谷歌提出了更高级别的全盘加密要求,要求厂商在新推出的设备上启用全盘加密(即使在没有设置屏幕解锁密码的情况下也需要全盘加密),同时达到了良好的性能要求。全盘加密提供了离线数据保护功能,增强了安卓设备的安全性。

全盘加密技术(Full Disk Encryption,FDE)属于动态加密,安卓全盘加密基于 Linux系统的设备映射框架dmcrypt实现∫对用户数据分区的透明加密存储。启用全盘加密功能后,所有写入到磁盘的内容都会在提交写入之前被自动加密,而所有从磁盘读取的数据在交给应用程序前会自动解密。

在安卓设备中,由于“/system”目录是只读的,不能存储用户个人数据,而数据分区(data)和T-Flash卡存储了大量可读写的用户数据,所以谷歌提出的全盘加密只针对这两部分进行。当应用程序需要读取某一文件时,首先调用操作系统提供的应用程序接口(Application Program Interface,APD),操作系统调用磁盘加密模块,将设备中存储的加密数据读取到内存中,内存中的数据解密后返回给操作系统,操作系统再将数据返回给应用程序。同样,当应用程序需要写入一段数据时,将数据提交给操作系统,由磁盘加密模块在内存中对数据进行加密,再写入到磁盘中。数据的加密与解密过程对于应用程序是完全透明的。

从Android 3.0到Android 6.0,谷歌不断改进其全盘加密技术,不断提高加密强度和性能。Android 5.0中默认启用全盘加密功能,但由于性能问题,各厂家的缺省设置中并未启用;Android 5.1中,全盘加密没有默认开启,而是标明“强烈推荐”;Android 6.0中,谷歌强制要求新设备默认开启全盘加密功能,而现有设备系统升级到Android 6.0之后没有要求默认开启。

安卓全盘加密使用AES-CBC加密算法,数据分区的每个扇区都被分别加密,AES密钥的安全性十分重要。在安卓磁盘加密中,用于加密磁盘的主密钥是随机生成的,由锁屏密码或PIN码(Personal Identification Number,SIM卡的个人识别密码)进行保护,主密钥经过加密后保存在元数据分区中。

从Android 3.0到Android 4.3中,均使用crypto footer结构保存加密的参数国,它在 Linux系统内核中LUKS结构的基础上进行了一些简化:LUKS支持多个密钥,并允许多个密钥同时进行加密解密,而crypto footer只存储一个密钥;LUKS中包含一个主密钥校验和,不用解密任何磁盘的数据即可检查输入密钥是否正确,而crypto footer不包括校验和,必须用输入密钥解密数据分区,获得匹配结果后才能验证密钥(锁屏密码或PIN码)正确与否。

安卓全盘加密功能初始化的过程中,系统首先随机生成一个128位的主密钥和一个16位的值(salt value),然后由用户输入的密码或者PIN码与值结合,使用 PBKDF2(Password-Based Key Derivation Function2,基于密码的密钥派生功能)将其迭代2000次后得到一个128位的密钥加密密钥(Key Encryption Key,KEK),主密钥则由这个密钥通过AES算法进行加密。PBKDE2迭代过程同时会产生一个初始向量,作为AES-CBC算法的初始向量,用于加密主密钥。Crypto footer将加密后的主密钥与盐值保存到元数据分区。

安卓设备启动时,系统读取crypto footer中的盐值,结合用户输入的PIN码或密码,使用PBKDF2迭代得到加密主密钥的密钥和初始向量,解密获得主密钥,提交给dmcrypt,解密数据分区。在安卓系统中,锁屏PIN码或密码最大长度为16个字符。多数情况下,用户锁屏密码设置得比较简单,全盘加密能够被破解。加密后的主密钥和盐值存储在磁盘的元数据分区上。破解者可以读取到盐值,尝试穷举所有的PIN码或密码,用PBKDE2算法得到主密钥的加密密钥的所有密钥值。再分别用这些密钥值解密主密钥,尝试解密磁盘。由于手机平台计算能力有限,还可以将手机数据分区和存储crypto footer的元数据分区拷贝到性能更强大的PC机上,去尝试破解密码。在这种方案中,4位的PIN码极易被破解,因此需要设置更长的锁屏密码来保证全盘加密的安全性。

在Android 4.4中,谷歌对全盘加密进行了改进,主要是用新的密钥推导函数Scrypt替换了原有的PBKDE2算法。Scrypt在计算时需要大量的内存,不适合使用GPU进行破解。Santoku是一个基于Linux系统的Python脚本,能够实现对Android 4.4全盘加密的破解,在酷睿i7 CPU上暴力破解4位PIN码大约花费30分钟。因此,Scrypt方案与BKDF2方案相比,大大提高了破解难度。

在Android 5.0中,谷歌对全盘加密功能添加了硬件关联,引人了可信执行环境(Trusted Execution Environment,TEE)签名。为了让主密钥能够抵抗离线攻击,扩展了主密钥加密算法,增加了使用可信执行环境密钥对AES加密密钥的签名过程。以这种新的加密方式产生的加密主密钥,几乎无法使用暴力破解。可信执行环境是智能手机CPU中的一块安全区域,它确保隐秘的数据能够在独立的、可信赖的环境中存储、处理并受到保护。可信执行环境能够为受信任的应用程序提供独立安全的执行空间,通过强制保护认证代码的执行来保障端到端的安全,并且具有机密性、真实性、隐私性、系统完整性以及数据访问权限等特点。此外,可信执行环境还提供高速计算能力和内存访问控制。

Android 5.0中密钥生成的过程为:

1. 随机生成16字节的磁盘加密密钥(DEK,即主密钥)和16字节的盐值。

2. 将用户输入的密码和盐值作为Scrypt的输入,产生一个32字节的临时密钥IK1。

3. 将临时密钥IK1及“0”填充到硬件私钥中。例如,硬件使用RSA加密算法,其私钥大小为2048位,IK1表示为:00 || IK1 || 00···00,即1字节的“0”、32字节的IK1、233字节的“0”,一共256字节,2048位。

4. 可信执行环境对填充的IK1进行签名,得到256字节的临时密钥IK2。

5. 将IK2和盐值作为Scrypt 的输入,产生32字节的临时密钥IK3。

6. 将IK3的前16字节作为AES-CBC算法的加密密钥,IK3的后16字节作为初始向量 (Initialization Vector,IV)。

7. 使用AES-CBC算法对主密钥进行加密。

显然,在获得crypto footer的情况下,由于可信执行环境的硬件签名功能,使得破解者无法从PIN码的计算中得到加密密钥,因此这种破解方式不再可行。

一般观点认为,安卓系统在隐私保护上与iOS相比处于劣势,iOS已经对用户数据强制进行了离线加密,声称苹果公司或是政府机构也不能直接恢复这些数据。随着Android 6.0的发布,谷歌在安卓兼容性定义文档(Compatibility Definition Document,CDD)中将全盘加密作为要求,而不是建议。对于内存容量大于512MB的设备,如果它支持安全锁屏,那么也必须支持全盘加密。此外,如果设备的AES加密性能高于50MB/s,必须默认启用全盘加密功能。该文件还规定了必须使用128位或更长的AES密钥,不允许将加密密钥写入存储区域等。可以预见,这一举措使得执法人员对安卓设备的取证变得更加困难。

本文就为大家讲解到这里,希望对大家有所帮助。

相关新闻