何文才 马鹏斐 刘培鹤 杨亚涛 肖超恩
1(西安电子科技大学通信工程学院 陕西 西安 710071)2(北京电子科技学院电子与通信工程系 北京 100070)
Android操作系统在现今的移动领域发展中占据着无法替代的地位。据2017年第一季度移动通信消费者指数显示,在智能移动终端中,Android操作系统所占的市场份额占智能移动设备销量的87.2%,该比重仍在持续上涨[1]。嵌入式数据库SQLite作为Android平台数据存储的主要方式,有消耗资源小、存取效率高等优点。然而,在原生SQLite中数据以明文形式存在,导致存于其中的数据会轻易地被人用文本编辑器查看。本文针对SQLite这一缺点,在Android平台下,通过对AES算法进行性能优化,设计一个可靠有效的SQLite数据库加密系统。
国内外很多学者也对SQLite加密进行了研究。文献[2]通过实验验证了AES-256算法在SQLite上的可行性,解决了Android平台下SQLite明文存储的安全问题,但没有对该算法的性能进行分析。文献[3]提出的XXTEA加密方案,将攻击所需的明文数量上升为280,提高了SQLite的安全性,但没有考虑Android平台下的工作情况,加密速率不够理想。文献[4]针对64位处理器的Android操作系统,对AES-256进行优化,用运算速率的些许降低换来存储空间减少、密码强度的提升,但并没有利用好Android系统多核的特点进行并行处理提升运算速率。在Android平台下,这些对SQLite加密的研究,也都没有考虑到密钥安全问题。
本文针对目前Android平台多核、存储空间有限、对速率要求高等特点,提出了一个更为安全高效的SQLite加密方案。该方案在安全性较高的CTR模式下,运用优化的AES算法对SQLite文件并行加密。在密钥扩展算法部分,通过对第一轮密钥的分析处理,降低密钥之间的耦合度,有效地抵抗了已知明文攻击。轮变换中,状态矩阵各行(列)进行分块并行处理,采用多核多线程机制,很大程度地提升了加解密过程的运算速率。
SQLite数据库是以文件的形式存在于Android源码中。对其加密有两种方式:将内容加密后写入数据库和对数据库文件加密[3]。前者加密不够彻底,加密后写入、搜索将会是问题,故本文选择相对安全可靠的对数据库文件进行加密的方式。
SQLite源代码没有提供加密功能,却保留了加密接口,供后续开发使用。加密接口包括sqlite3_key()、sqlite3CodecGetKey()、sqlite3_rekey()和sqlite3Codec-Attach()[4]。在本方案的实现中,用本文优化的AES算法来实现这些接口即可。其中,sqlite3CodecAttach()的实现相对复杂,流程图如图1所示。
图1 sqlite3CodecAttach()函数流程图
口令的来源有两种,用户创建账号时自行设置的密钥和主数据库的密钥。系统确定密钥来源后,调用相应函数获取口令,实现sqlite3CodecAttach()函数,继而在sqlite3_key()中调用。
根据Android平台可利用硬件、空间资源有限的特点,本文采用优化的AES算法对其进行加密,以保证SQLite数据库的性能和安全性。
AES加密算法加解密过程中密钥相同,密钥长度有128位、192位、256位三种。加密过程中,不同的密钥长度拥有不同的加密轮次。AES属于分组密码,每次可以处理特定长度的块数据[5]。
AES算法包括明文与初始密钥“异或”、轮变换、密钥扩展算法三个部分。其中,后两部分相对复杂且有良好的优化空间。加密时,明文与初始密钥“异或”后,对其执行轮变换操作。轮变换过程有字节替换(SubBytes)、行移位(ShiftRows)、列混合(MixColumns)、轮密钥加(AddRoundKey)。轮变换过程中最后一轮没有列混合步骤[4]。
字节替换是非线性变换的过程,用S盒取代“乘逆”、“仿射”运算,通过查表的方式实现字节替换。在AES-128中,每个表需要256字节,10轮就有160个S盒。Android平台是允许这部分空间耗损的。而在AES-256中,S盒由原来的8×8变为16×16。如果使用标准AES的S盒查表实现,则每一张表需要65 536字节的存储空间,10轮共需要160个S盒,占用资源太大,无法查表实现。因此,在空间资源允许的情况下,为了不降低运算速率,本方案选择优化AES-128算法。
在标准的AES-128算法中,行移位过程是以字节为单位,“左移”N个单位的算法。其中,N为各字节所在行数。列混合部分是利用状态矩阵与固定矩阵相乘来进行混淆。轮密钥过程运用状态矩阵和128位轮密钥“异或”[6]。轮变换中,每一轮的轮密钥由初始密钥和密钥扩展函数计算得出。密钥扩展算法部分,将128位初始密钥经过运算扩展出加解密过程所需的176字节的密钥。四个字节为一个字,得到的前四个字作为AES-128算法加解密过程的第一轮密钥。该过程总共需要11组密钥,即10次轮变换密钥和轮变换前“异或”操作的初始密钥。
常用的数据库安全机制有:用户身份认证、存取控制机制、数据加密、数据库操作审计和攻击检测[7]。本方案主要从前两个方面建立SQLite安全模型,如图2所示。
图2 SQLite数据库安全模型
(1) 用户使用应用程序客户端并根据提示输入正确的密码,只有当系统通过用户身份验证将其识别为合法用户时,用户才能进入SQLite数据库并对其进行操作。
(2) 为了避免一些恶意攻击者绕过身份认证环节,直接打开SQLite数据库窃取、篡改隐私信息,该模型采用整库加密的方案。
(3) 一部分不法分子会试图窃取合法用户的认证口令,此安全模型将用户口令单独加密成密令,和密文一起存储在本地数据库,保护用户口令安全。
经分析得出,SQLite安全性的强弱取决于加密算法的可靠程度。
用户存取数据时,SQLite加解密的整体结构如图3所示。
图3 SQLite加解密过程
系统首先判断用户是否首次登录;若是,用户创建口令,系统口令经过MD5散列转化为固定长度的输出,作为优化AES加解密算法的初始密钥K,并存储在SQLite中;若不是,继而判断输入口令是否正确,正确则进入系统,执行相应加解密操作。
密钥是加密算法中尤为重要的一部分。在AES的原始密钥生成算法中,除了初始密钥w0、w1、w2、w3之外,每个密钥都是有先前的密钥操作获得的。假设知道其中任何一轮密钥,即可破解全部密钥,这会对数据安全造成极大的威胁。
针对这一问题,本系统采用一种改进的密钥扩展算法方案,提高密钥的安全性。改进的算法过程如下:生成一组与初始密钥无关的4个字(w4,w5,w6,w7)作为第一轮轮密钥。然后将每个字“左移”1位,与w4、w5、w6、w7做“异或”运算,再对结果进行原有AES密钥扩展算法运算产生其他轮密钥。改进后算法过程如图4所示。
图4 改进的密钥扩展算法过程
性能分析:
设初始密钥为n比特,穷尽密钥攻击最佳情况是1,即一次就猜中初始密钥,最差情况是2n,即尝试了密钥空间所有的可能才得到正确密钥。穷尽密钥攻击的平均复杂度是:
(1)
改进前,由式(1)计算出的复杂度为2127,而在算法改进后,该值提升为在2255~2511之间。以目前的计算能力,在有限时间内,完成这种穷尽搜索是几乎不可能的事情。
改进的密钥扩展算法降低了密钥之间的耦合度,增强了密钥生成阶段的不可逆性,可有效抵抗穷尽密钥攻击。在第一轮、第二轮密钥之间加上简单的“移位”、“异或”操作,既可以有效防止穷举攻击,又可以不影响整体加密速率。就算攻击者得到某一轮的密钥,也无法直接推出初始密钥和第一轮密钥,很好地增强了密钥的安全性。
在AES-128算法中,10轮轮变换需160个S盒,一个S盒中的表需256字节。即一轮加密大约需要消耗的空间大小为256×160/1 000=40.96 KB,可见空间占有极少。这种用较低的空间消耗换取运算速率上的提升符合Android平台的需要,故该过程不做变化。
标准AES算法中的运算是在确定状态矩阵各行或各列都已经过每一步变换,才执行接下来的运算操作。本文研究的加密方案是工作在Android平台下的,而目前Android手机的硬件环境都在四核以上。因此,可以利用这一硬件特点,在轮变换中使用并行计算来提高算法的计算效率。
经分析得知,SubBytes、ShiftRows变换都作用于行,MixColumns作用于列,AddRoundKey作用于每个元素。据此,可以对状态矩阵进行分块处理:在每一行字节变换后,继续行移位操作;在每一列列混合后,进行AddRoundKey操作。用这种并行方式可以在每一行(列)运算时省去等待其他行(列)运算完毕的时间。以4核4线程为例,优化后的轮变换步骤如图5所示。
图5 改进的轮变换过程
性能分析:
由图5可知,若SubBytes、ShiftRows、MixColumns、AddRoundKey过程各行(列)运算消耗时间分别为Ta、Tb、Tc、Td,标准AES-128算法轮变换消耗时为:
T128=4(Ta+Tb+Tc+Td)
(2)
改进后的轮变换消耗时间为:
(3)
理论计算可得,改进后的轮变换过程消耗的时间为改进前的1/4。扩展可得,对N核N线程的Android手机,使用该方案改进后的轮变换过程消耗时间为改进前轮变换消耗时间的1/N。实际测试中,由于受硬件平台、环境、操作等因素的影响,测试结果不会和理论值一样理想,但仍然可以很大程度地提升运算速率。
AES分组密码算法的几种基本工作模式中,支持并行计算的有ECB模式(电码本模式)和CTR模式(计算器模式)[4]。前者在明文相同时每次加密所得的密文都是一样的,容易在已知明文的情况下受到攻击,安全性不强,故本方案采用CTR模式优化AES算法。
CTR模式下,分组明文可为任意长度,操作自由便捷,适用于运算速率的提高。其加解密流程分别如图6、图7所示。
图6 CTR分组模式加密流程
图7 CTR分组模式解密流程
由加解密示意图可以看出,CTR模式下有一个自增的算子Tn,Tn用密钥K和加密算法加密后的输出,与明文块“异或”得到密文。由于每次运算的算子Tn不同,相当于该模式下各分组加密时的密钥不同。这弥补了ECB模式的不足,安全性极高。
本方案中,Tn为随机产生的128位的计数器,n=1,2,…,q,每次用完自动加1。由于各明文分组输入输出没有关联,因此可以并行处理。本系统将明文按每块128位分组。若最后一组不满128位,则取最高有效length位,余下128-length位舍去。
本文研究的Android平台应用层基于Java语言开发,通过创建线程池,运用多线程来完成并行处理。在本系统所使用的4核4线程的硬件环境下,每次执行4个分组。由此可得,运用该方案研究的CTR模式,不仅安全性有了很大的提升,加密所消耗的时间理论上也可缩短为串行加密的1/4,运算速率提升明显。
实验1:在Android平台下新建测试应用程序,在其中创建一个名为man.db的数据库,为其新建一张student表,包含user、phone字段,并设置user字段为主键。向其中插入十条数据,通过DDMS(Dalvik Debug Monitor Service)导出,用SQLite Expert工具查看。
在不加密的情况下,可以清晰看到各字段信息,查看结果如图8所示。在使用加密算法的情况下,必须输入正确口令通过身份认证方可进入数据库。如果密码错误或直接用工具打开查看,则会有“file is encrypted or is not a database”的错误提示。
图8 未加密时插入的数据信息
Android平台下数据库加密系统主要的衡量标准,是加密后该数据库的性能没有受到过多影响。表现为加密后占用的存储空间没有明显增加,加密速度足够快,系统的安全系数较高。下面将分别从这几个方面对该SQLite加密系统的性能作以分析。
本方案在对SQLite加密时,实现了SQLite接口中的加密函数,无疑会增加SQLite数据库源码的空间占用率。但在编写加密函数时,已尽可能地减少加密过程中对空间的占用。主要表现在:
(1) 代码编写时,在初始化部分添加了临时数据的释放函数。比如,在使用完计数器Tn,自增得到Tn+1后,及时释放Tn。
(2) 在AES算法并行处理部分,使用了Java多线程机制和线程池。在没有任务时,线程在线程池中处于休眠状态,只占据很小的内存空间。本方案中运用线程池管理线程可以防止并发过多,以免内存被过度消耗。
(3) 该SQLite数据库加密系统使用AES加密,加密前后明文密文的存储量是一样的,只是改变了状态矩阵中的数值。
由上所述,该安全系统在Android平台下的空间增量可以忽略不计。
实验2:加解密消耗时间的测试。System.currentTimeMills()函数可获取系统当前时间,实验过程中,用此函数分别获取系统加密前后的时间点,从而计算出时间差即为加密所消耗的时间。插入数据的实验可得到加密耗费的时间,如图9所示。查询数据的实验可获取解密耗费的时间,如图10所示。
图9 加密消耗时间比较
图10 解密消耗时间比较
计算分析可知,用本文优化的AES算法不仅没有降低标准AES加密性能,反而将加密速度平均提高了28.7%,解密速度平均提升了23.5%,运算效率较好。
实验1和实验2是在CPU环境为四核四线程的情况下执行的。实验3将利用本文优化的AES加密算法,通过创建不同数量的线程(实验以单线程、4线程、8线程、16线程为例),对该SQLite加密系统的速率变化作以分析,测试结果如图11所示。
图11 各线程下加密消耗时间比较
可以看出,对于大小在2 MB以下的短小明文,增加并行线程数(8或16个线程)不会导致AES性能的提升,反而会随着线程数增多而下降。经分析,这可能是因为并行化过程中,创建大量线程、对明文分组、处理密文时也需要占用资源和时间。实验表明,使用本文提出的加密系统,4线程比较适合处理短小明文。
本系统在CTR模式下执行优化的AES算法,每次产生的计数器初值都是不同的,是通过随机函数产生的16个无符号字符,可以避免因每次产生相同初值造成明文攻击。
在对AES算法做了优化后,解除了初始密钥和轮密钥之间的关系,并对第一轮密钥做了简单运算变换,扰乱了攻击者的思路,提升穷举攻击的难度量级。另外,该安全系统通过MD5单向散列函数对用户口令加密生成初始密钥,并将口令密文存储,密钥安全得到了很好的保障,达到了研究目标。
本文针对Android平台的硬件特点,对AES-128算法进行了优化,并将其应用在SQLite数据库中,保护移动端数据隐私。密钥扩展部分的优化提高了算法的安全性,轮变换部分和CTR模式的并行优化提高了算法的运行效率。实验结果表明,在该方案下,4线程更适合2 MB以下的短小明文加密。与优化前的标准AES算法相比,优化后SQLite加密速率平均提升28.7%,解密速率平均提升23.5%,同时有效抵抗了攻击,增加了Android平台数据隐私保护的安全性,达到了研究目的。