基于多云存储的Android密钥管理技术

2020-09-09 03:09余宇劲
计算机应用与软件 2020年9期
关键词:服务端份额解密

余宇劲 凌 捷

(广东工业大学计算机学院 广东 广州 510006)

0 引 言

Android是一款基于Linux的,拥有开源性和可移植性的智能移动操作系统。2008年9月,谷歌公司发布了第一版Android 1.0系统,至今Android系统已经占据了全球智能手机操作系统份额的85.9%。随着Android设备的广泛使用,Android平台上的恶意软件数量急剧增加,腾讯安全实验室在2019年公布的手机安全报告中指出,去年国内Android新增病毒包达800.62万个,Android手机病毒感染用户数近1.13亿。2018年手机病毒类型占比中,隐私获取与远程控制的综合比例为17.57%。 Android设备中隐私数据的存储是一个难题,隐私数据包含用户敏感信息、设备信息、密钥等,其中密钥的存储是关键问题。

Android系统中的密钥一般可分为两种:一是安卓应用中,用来与服务器通信,或是加密App自身数据的密钥;二是安卓应用中因为加密文件产生的密钥。目前针对Android设备的安全问题,国内外学者已经做了大量的研究。文献[1-3]指出了近年来Android设备安全问题研究优点和不足,详细归纳了Android系统的安全缺陷以及所面临的威胁。在企业移动管理系统上,文献[4]提出了密钥容器的概念,保护文件的加密密钥,实现了移动端的安全存储,但该方案需要对已有App进行函数重写以及重打包,实现成本高。文献[5]提出了基于RFID智能卡的 Android 移动终端数据保护方案,可以增加攻击者破解难度,把密钥信息存放在RFID卡上,采用机卡配合的形式,增加安全性,但是需要额外的硬件如智能卡、设备的NFC支持。文献[6]提出了基于指纹与移动端协助的口令认证方法,利用指纹和口令结合生成密钥,避免了密钥的存储,但其需要存储指纹信息,存在安全隐患。文献[7-8]提出了一些攻击手段,可以远程使存储在设备上的密钥泄露。文献[9]提出了在Android平台上进行多云存储的思想,将密文分片后进行压缩,然后分存到不同云服务商上,可以避免厂商锁定的危害,有一定的可用性,但其密文分片的计算量很大,对于计算力有限的安卓设备会是一个巨大的开销。文献[10]提出了一种基于位置的移动设备加解密模型,使用位置信息结合密钥进行加密,用户只能在有效位置内进行解密。文献[11]提出在安卓应用开发中将密钥分存在SharedPreferences、文件存储、Setting.System中,提高了数据的安全性,创新性地将密钥分存的思想引入Android客户端的开发中。文献[12]在亚马逊S3(传统云平台)的基础上提出一种密钥管理(Key Manager,KM)的概念,KM向用户请求密钥并与云服务商交互。但此方案没有考虑用户端是否存在恶意操作,如果用户端受到入侵,那么数据的安全不能得到保障。

为了解决Android设备中密钥的安全存储问题,本文提出一种结合密钥分块和多云存储的密钥安全存储技术,实现了密钥的安全存储,无须额外硬件支持,在终端设备上不涉及密钥信息存储,对文件加解密时间的影响较小,实验证明了其安全性、可靠性和实用性。

1 预备知识

1.1 秘密共享

秘密共享方案中,有一个加密者和一组共享者{P1,P2,…,Pn},加密者持有一个秘密s∈S,为每个共享者产生一个保密的秘密份额,使得共享者的任何一个授权集合能够通过他们各自掌握的份额恢复出s。

(1) 秘密分割。秘密分割是由加密者实现的一个映射:

F:S·R→S1·S2·…·Sn

其中:S是秘密所在的集合;R是随机输入集;Si(i=1,2,…,n)是Pi的秘密份额集合。对∀s∈S,∀r∈R,映射F(s,r)得到一个n元组(s1,s2,…,sn),使得si∈Si(i=1,2,…,n)。si称为Pi的份额,记为Fi(s,r)=si,加密者以秘密方式将si给Pi。

(2) 重构。s能被任一授权集合重构,即对∀G∈A,A为授权集合,设G={i1,i2,…,i|G|},有一个重构函数:

hG:Si1·Si2·…·Si|G|→S

使得对∀s∈S,∀r∈R,如果F(s,r)= (s1,s2,…,sn),则有:

hG(si1,si2,…,si|G|)=s

方案的安全性要求:任一非授权集合都不能得到s的任何信息[13]。即一个秘密被n个人分享,只有m(m≤n)个或更多的参与者联合可以重构该秘密,而任意小于m个参与者不能得到该秘密的任何信息,以上定义为(m,n)-门限秘密分割方案,m称为方案的门限值。

1.2 Android系统中的存储

Android系统中存储方式包括文件存储、SharedPreferences存储、数据库存储等。其中:文件存储是Android中最基本的一种数据存储方式,它不对存储的内容进行任何格式处理,所有数据都原封不动地保存在文件中,适合存储一些简单的数据;SharedPreferences使用键值对的方式存储数据,即保存数据时,给此条数据提供一个键,在读取数据时通过对应的键取数据,如果把密钥直接存储在SharedPreferences很容易被窃取;数据库存储,Android内置了数据库SQLite,适合存储量大、结构性复杂的数据。

要在设备上安全存储密钥,目前常用的办法是不断加固客户端,增大逆向成本。为了提高安卓设备上密钥的安全性,本文不在本地上做密钥的任何存储,将密钥按照秘密共享的思想,拆分成n块秘密份额,上传到n个云平台上,即使是逆向成功,或是某云服务器与云客户端以某种方式进行合谋攻击,也不能获得密钥去解密密文。

1.3 多云平台

云存储是在云计算概念的基础上发展起来的一种新的存储方式,它是指通过网格计算、集群文件系统、分级存储等现有技术,将网络中大量的存储设备通过硬件、软件的方式集合在一起,并对外提供标准的存储接口,以供用户调用并存储数据的存储方式[14]。国内已经兴起了多种云平台如阿里云、腾讯云等。云存储的最大特点在于存储即服务,用户可以通过开放的API将自己的数据上传到云端保存,如百度Pesonal Cloud Storage(PCS)、阿里开放云平台。但由于用户丧失了数据的绝对控制权,一些数据安全的隐患也由此产生[15]。恶意云服务器与云客户端进行合谋窃取用户隐私,以及目前已知的多种攻击手段如拒绝服务攻击、僵尸网络攻击、音频隐写攻击等都会造成用户数据泄露。单云环境下还可能出现厂商锁定或者服务器损坏的场面,用户的数据安全得不到足够的保障。

单云下存在诸多潜在的安全问题,如服务可用性故障、内部人员的恶意破坏等,为了提高云存储可靠性,充分利用各个云的优势,多云架构应运而生,通过在多个云存储服务中分散存储用户数据的方式来避免和缓解云存储提供商垄断问题。这样既可解决单云故障问题,又能提高安全性、可靠性,降低更换云服务提供商的成本。

各大云平台开放的API使开发者能够把自己的App和云服务端建立连接,根据API类型进行不同的操作,如图1所示。

图1 与云平台建立连接

2 方法描述

本文提出的结合多云存储和秘密共享的密钥管理技术由三个部分组成,分别是加密部分、解密部分、处理密钥部分, 其中处理密钥部分是核心。

加密部分:负责结合用户输入的一次性口令产生随机密钥,对文件进行加密。

解密部分:与处理密钥部分进行交互,利用传回的重组的密钥进行解密。

处理密钥部分:进行拉格朗日插值多项式运算,选择服务器,验证服务器,传输完毕后删除密钥。

实现原理如图2所示。

图2 技术原理图

2.1 加密阶段

安卓端启动加密程序,结合用户输入的一次性口令p生成随机密钥s,对明文M进行AES加密,得到密文C,存储密文完毕,删除p,初步加密完成。

2.2 密钥保护阶段

设门限法方案选择(m,n)=(3,5),将密钥通过拉格朗日插值多项式进行切片,即生成5个秘密共享项,任意大于等于3个共享项即可解密。具体步骤如下:

(1) 生成随机数R1、R2、x1、x2、x3、x4、x5。

(2) 计算对应的F(xi):

(3) 给不同的(xi,F(xi))分配唯一的ID,发送给5个云服务端,删除R和s。ID的作用是在多密钥共享的情况下,区分不同的密钥对应的(xi,F(xi))。

在密钥保护阶段完毕后,无论是本地还是云盘中,都不涉及到口令和密钥的存储,而是转换成(xi,F(xi))的存储,无须上传密文,实现了用户数据的私有化。

2.3 解密阶段

当用户需要解密时,安卓客户端向随机的三个服务端发出请求,进行各自的验证,验证通过后,根据ID依次返回(xi,F(xi))给安卓客户端,客户端进行方程组求解,得到s,进行解密。本文解密阶段涉及到与不同的云进行交互,随机选取m个云服务商进行验证,查找ID,返回(xi,F(xi)),因为传输体积小,所以网络消耗和时间成本较低。

2.4 安全性分析

文献[11]将秘密份额存储在SharedPreference、文件存储和系统数据库Setting.Systeam中,提高了攻击者的破解难度,但是因为在Java层实现,攻击者可以从apk文件包中解压提取出classes.dex文件,利用反编译工具(如apktool、Jadx等)获得Java源码,进而分析出秘密份额存储位置进行重组密钥。本文方法需要获得凭证与多个云服务端建立连接,才能够进行密钥重组操作,假设攻击者逆向成功,只能得到密钥的拆分方式,用户的一次性口令和秘密份额都已被删除。用户与n个云客户端之间的通信,通过Android沙箱机制相互隔离,所以攻击者与m个云服务端建立连接的可能性相当低,极大地降低了攻击者获得密钥的可能性。

即使某个云服务商想窥探存储在该云的数据,或者是黑客攻击云存储平台,也只能得到部分的秘密份额(xi,F(xi)),这对整个解密过程是无意义的。假设运行在客户端上的云客户端得到了root权限,在未经用户许可的情况下,与对应的云服务商进行合谋,窃取用户密文,因为小于m个云服务端不能恢复密钥,所以不能进行解密,攻击者没有办法得到密钥和明文信息。

3 实验与结果分析

本实验开发环境使用了Android Studio 2.2进行界面和逻辑编写,Eclipse 4.10用于Java代码调试;测试手机型号为Nexus 6,手机参数为Android 7.0系统,3 GB内存,CPU类型为骁龙805。利用本文方法对KB级到MB级的14个文件进行加解密测试,结果如表1所示。

表1 文件加解密时间

续表1

处理密钥时间为加密之后的分片时间加上解密之前的组装时间,和密钥长度有关。基于设备和实验环境的原因,加解密时间不是线性增长的,但总体是随着文件大小而上升的。

本文中,处理密钥时间与密钥长度有关,当文件大小增大时,处理密钥时间占总时间的比重会缩小,对加解密时间的影响越小,如图3所示。

文献[8]提出在将密钥分存在Android设备中的不同位置,如存储在SharedPreferences、文件存储、Setting.System等,选取该方案作为对比,处理相同位数的密钥,所用时间对比如图4所示,纵坐标为本文方案所用时间减去文献[8]方案所用时间。

文献[8]方案在Java层实施,分存在同一设备的不同地方,相对于密钥直接存储和密钥硬编码,提高了安全性,与本文方案对比,不需要与云服务商交互,节省了传输时间,但是将秘密份额分存在设备上,只要逆向了源文件,得到Java代码,便可以分析秘密份额存储位置,从而获取密钥。本文方案则是在密钥保护阶段,通过与多云平台交互,将秘密份额存在不同的云服务端上,逆向不能得到密钥存储的相关信息,具有更高的安全性。

由于实验环境、设备参数、代码复杂度等因素存在差异,所以实验结果会有一定的误差,但是总体来看时间差稳定在100~150 ms内,不会影响用户体验。

4 结 语

本文提出了一种新的Android密钥管理技术,通过结合多云存储和秘密共享的思想,在密钥处理阶段,将秘密份额存放在n个云服务端上,与现有方案相比,减少了逆向得到密钥信息的可能性,能够避免云客户端和云服务端的合谋攻击,实现了Android客户端密钥的安全存放。在大文件加解密时,对加解密总时间的影响会显著减少,具有实用性。

猜你喜欢
服务端份额解密
炫词解密
解密“一包三改”
澳大利亚可再生能源首次实现供给全国负荷的50.4%
炫词解密
炫词解密
新时期《移动Web服务端开发》课程教学改革的研究
基于三层结构下机房管理系统的实现分析
基于三层结构下机房管理系统的实现分析
什么是IMF份额
父母只有一人留遗嘱,效力如何认定?