一种iOS下移动APP安全防护系统及方法与流程

文档序号:15559029发布日期:2018-09-29 01:48阅读:203来源:国知局
本发明属于移动安全的
技术领域
,具体为一种ios下移动app安全防护方法。技术背景ios和android是用户使用率最高的移动操作系统,其中ios系统源码不公开,以及严格统一的app应用上架审核机制,比android具有较高的安全性;另外,苹果公司为ios系统设计了一系列安全机制,如:代码签名、沙盒机制、aslp、加密保护等。虽然ios有较完善的安全机制,但是因为开发者对应用安全的疏忽,还是存在一些常见的安全威胁。本方法主要针对开发中常遇到的五个安全威胁进行防护:(1)系统键盘安全威胁,用户在使用app时,经常会遇到账户密码输入等敏感信息输入问题,特别是针对金融类app,防止键盘输入内容被监听,对用户数据的保护非常重要。(2)用户数据本地保存安全威胁,用户在使用app时会产生许多用户信息,一部分数据采用数据库的形式进行保存,另外一部分数据以word,pdf等大文件的形式保存在本地app中,这些数据如果没有防护措施,易造成数据泄露。(3)app敏感信息保存安全威胁,在日常开发过程中,避免不了对一些app敏感信息的处理例如app加密密钥,多数开发者采用硬编码形式或plist文件进行保存,但是其存在巨大的安全隐患,一旦app被逆向,以上信息都会遭到泄露。(4)app源代码泄露威胁,在日常开中,因为苹果现有的安全加固技术,开发者容易忽视对app源代码进行保护,攻击者可以通过逆向的方法从源代码中得到通信协议或者代码逻辑,对app进行攻击。(5)热更新脚本篡改威胁,为了满足快速变化的需求,热更新技术已经被众多app使用,但是热更新脚本代码的获取与保存还存在一些安全问题。技术实现要素:本发明的目的是针对现有技术的不足,提供一种ios下移动app安全防护系统及方法。本发明解决其技术问题所采用的技术方案如下:一种ios下移动app安全防护系统,包括安全键盘模块、用户数据安全保存模块、app敏感信息保存模块、源代码保护模块、安全热更新模块;安全键盘模块:具有防通过坐标获取键盘输入信息、去缓存和防录屏的功能,将自定义的安全键盘模块代替原系统键盘,并通过runtime机制对录屏进程的监听,有效阻止用户输入信息的泄露。安全键盘模块启动实现过程如下:①监听用户输入事件。②拦截系统键盘弹出。③检测是否在录屏的进程,若发现正在录屏,则弹出警告并收回安全键盘模块;否则启动安全键盘模块,产生一组随机数,将键盘中的键位随机布局。④键盘根据布局模板进行显示,点击键盘按键显示输入信息。用户数据安全保存模块:对用户数据进行分类保存,根据不同数据类型以及大小不同给出不同的加密方案。将用户数据分为以下两类:①用户字段信息,例如用户名,密码等,该类型数据量小,并有数据处理的需求:例如排序,取最大数等,该类数据一般使用sqlite数据进行保存,大部分sqlite文件会保存document当中。②用户处理的文件数据,例如word,ppt,视频文件等,该类数据因为内存大,直接保存在documents或library当中,针对这两类数据提出相应地安全保存的方法。针对sqlite数据库中用户字段信息的安全存储,提供两种加密方案:①对数据进行加密,加密以后再保存到数据库当中。②将数据库sqlite文件转换成二进制,对sqlite的二进制文件进行加密,开发者可以根据需求进行调用。针对文件安全存储加密方案如下:首先将用户文件根据文件内存大小,分成小文件和大文件;对于小文件,因为其内存小可直接使用对称密钥进行加密。对于视频、音频等大文件,由于移动端计算能力不高,如果直接转成nsdata后加解密,不仅需要等待较多时间,而且消耗大量cpu和内存进行计算。因此本发明首先使用压缩方法对文件进行压缩,然后选择文件对应编码方式使用datausingencoding方法将文件转化成nsdata,最后使用base64编码进行加密。app敏感信息保存模块:实现了sskeychain安全存储容器,并对plist文件进行加密,具体如下:首先,安全plist文件保存app中的plist文件分成两类,一类为系统自带的info.plist文件,其中包含了一些应用配置信息,例如应用名,应用版本号等等,另一类则是开发者自己创建的plist文件。对于第一类文件,因为含有系统信息,如果对其加密,系统则无法识别内容而导致app崩溃,所以不能直接对inof.plist进行加密,该过程可以直接使用用户数据安全保存模块中的用户字段信息加密api进行加密。对于第二类文件,因为plist是以xml明文的形式进行保存,可直接转为字符串进行加密处理。其次,使用sskeychain保存信息keychainservices是osx和ios都提供的一种安全地存储敏感信息的工具,比如:存储用户id、密码和证书等。由于keychain方法的代码冗余度高,可读性差,因此在keychain的基础上设计了sskeychain,对keychain的方法类进行封装,大大方便开发者对keychain的使用。本发明设计对于keychain源代码进行封装,创建了sskeychain工具类,头文件定义了三个方法:keychain保存、读取和删除数据;然后在实现文件中将定义的三个方法抽成一个方法类;以存储方法为例,每一个存储方法唯一不同的是存储的键key和键值value不一样,而其他的调用查看是否已存在,更新键值,创建新键值对的方法都是一样的。所述的敏感信息包含用户数据安全保存模块中加密使用的密钥、集成第三方sdk的appid和appsecret,以及应用的网络接口等信息。源代码保护模块:对app应用源码中的文件名、方法名和类名等进行混淆,分为关键字提取、创建数据库和混淆,具体如下:首先,关键字提取在ios应用编写过程中,对存在的文件名、类名、协议名和函数名四类关键字进行准确提取。其次,创建数据库本发明采用sqlite数据库来保存关键字,sqlite具有支持多个主流的操作系统;其核心引擎本身不依赖第三方软件;不需要安装;所有信息(例如表,视图,触发器等)都包含在一个文件内等优点。创建对应表的字段如下4-1表,src保存原关键字,des保存混淆后名字。表4-1混淆数据库表src原关键字des混淆后的关键字然后,对关键字进行混淆本发明采用md5算法对原关键字进行混淆,该算法具有压缩性、计算效率高、抗修改性、强抗碰撞的特点,符合混淆不可逆且安全的需求。其实现过程如下:首先提取数据库中的src字段内容,调用shell命中的md5sum函数对src中的内容进行md5计算,完成后将md5值存入des字段。安全热更新模块:热更新脚本使用https协议进行传输,本地执行的热更新脚本代码使用哈希算法验证其完整性,具体实现如下:首先,热更新脚本安全下发本发明热更新脚本安全传输过程如下:①使用一个会话秘钥key对脚本文件进行加密,得到加密脚本。②对脚本文件进行一次md5运算,得到脚本文件的信息摘要。③使用服务器的私钥对会话秘钥key进行加密,得到加密key。④同时也用私钥对过程②的md5值进行加密,得到加密md5。⑤将加密key、加密脚本以及加密md5发送至客户端。⑥客户端使用服务器公钥对加密key进行解密,得到key。⑦客户端使用服务器公钥加密md5解密,得到md5。⑧使用key解密得到脚本文件。⑨客户端对脚本文件进行一次md5操作。⑩对比过程⑦和过程⑨中的md5,判断脚本在传输过程中是否遭到修改。本发明使用https传输协议对以上过程进行实现。其次,热更新脚本本地安全当本地客户端调用脚本文件时,本方法会对脚本文件进行一次md5计算,并将计算结果发送至服务器进行验证,即在热更新脚本安全下发过程⑤加入脚本安全验证的过程,只有服务器验证通过,才可以执行脚本文件中的内容。本发明有益效果如下:本发明研究分析了现有分析了ios-app开发过程中常遇到的五个安全问题,提出了一种ios-app安全防护方法。该发明将五个安全威胁的解决方案集成到一种安全防护框架方法中,开发者只需要将安全防护方法运用到app中,正确部署即可对app做出有效的安全防护,方便开发者解决app安全问题,减少开发时间,提高app的安全性。附图说明图1总体架构设计图图2安全键盘设计流程图图3mach-o文件结构图图4安全键盘字符随机化的过程图5安全键盘布局图图6两种用户数据加密的方案图7两种文件存储方案流程图图8热更新代码安全下发流程图图9脚本文件验证过程具体实施方式为使本发明实现的技术手段、创作特征、达成目的与功效易于明白了解,下面结合附图对本发明作进一步的说明。如图1所示,一种ios下移动app安全防护系统主要包含以下五个安全模块:键盘信息的安全输入模块、用户数据安全存储模块、应用敏感信息安全保存模块、代码混淆模块和安全热更新模块。以下对各模块进行详细描述:(1)安全键盘模块:该功能包括防攻击者通过点击坐标获取输入信息攻击,防止键盘缓存保存用户敏感信息,以及键盘信息输入时录屏接口的监听。(2)用户数据安全保存模块:该模块功能对常用的本地存储数据文件类型进行了安全保护,包括数据库文件和普通文件。(3)应用敏感信息安全保存模块:针对应用敏感信息,设计实现sskeychain对应用敏感信息进行保存,另外,对保存应用信息plist文件也进行加密。(4)代码混淆模块:该模块功能对应用源代码进行混淆,包括方法名混淆,类名混淆和文件名混淆。(5)安全热更新模块:该模块对热更新脚本从服务器安全获取和本地安全保存。一种ios下移动app安全防护系统的实现方法,具体包括如下步骤:步骤1.启动安全键盘模块,具体实现如图2:1-1监听用户输入事件该过程为当用户使用uitextfield控件输入信息时,监听键盘的弹出事件,其主要实现方法是使用kvo技术监听键盘弹出。其实现过程如下:首先创建一个观察者,;然后给观察者添加观察内容,键盘的监听事件有四种状态:uikeyboardwillshownotification键盘即将显示;uikeyboarddidshownotifition键盘已经显示;uikeyboardwillhidenotification键盘即将隐藏;uikeyboarddidhidenotification键盘完全隐藏;本文需要监听uikeyboardwillshownotification键盘即将显示事件,添加完成后,即完成了对键盘输入的监听。在控制器viewdidload方法中使用addobserver添加观察者,@selector代表观察者触发事件后回调后方法,name代表观察者的触发事件,本过程主要对键盘即将显示事件进行观察。1-2拦截系统键盘显示当uikeyboardwillshownotification键盘即将显示事件触发时,系统会直接调用系统keyboard进行显示,为了能够显示本文设计的安全键盘,需要对系统键盘进行拦截,并替换成安全键盘,在步骤1-1中的keyboardwillshow方法中添加拦截代码即可实现系统键盘的拦截。其具体实现过程如下:在ios系统中支持键盘输入的控件有uitextfield和uitextview,在这两个控件中有firstresponder(第一响应者)的属性,当用户点击输入框时,系统先调用resignfirstresponder方法取消uitextfield第一次响应者的属性,当该属性被取消,系统键盘便会隐藏,达到阻止系统键盘弹出目的。1-3检测是否存在录屏进程该过程检测是否存在录屏进程的调用,如果存在则停止安全键盘启动,并通知用户存在恶意录屏。检测app是否存在录屏进程的实现方法有以下两种:1.遍历app应用的所有framework,检测是否包含了replaykit框架。在ios系统中,app的可执行文件以mach-o格式进行保存,其文件结构如图3所示,app在启动时通过loadcommands将所有框架(例libobjc.a.dylib,libsystem等)动态链接到app中,遍历mach-o文件中loadcommands,判断app是否包含replaykit框架。该方法通过检测整个app是否调用replaykit的方式来判断是否存在录屏进程,判断过于严格,易于造成误判。2.通过检测replaykit的方法调用判断是否存在录屏进程,运行时再次判断,进一步消除上述方法的误判。其原理是:object-c是动态语言,程序中的方法调用不是编译时决定,而是运行时,其动态性实现的主要技术是runtime机制,简称运行时,是一套由纯c代码编写的api,在object-c中一个类的数据结构为结构体如下代码所示,其中包含了类名name和其所有的方法名数组method_list,所以该检测过程只需要遍历method_list方法列表中所有的方法名,即可以判断是否存在恶意调用录屏进程监听键盘输入;其主要实现过程如下:在replaykit中rpscreenrecord是录屏功能的操作对象,其中inti方法为rpscreenrecorder对象的创建方法,startrecordingwithmicrophone是rpscreenrecorder启动录屏方法。本文在安全启动时,使用runtime机制,遍历rpscreenrecorder对象中所有方法是否存创建和启动录屏两个方法,可达到判断是否存在录屏进程的目的。开发者可以根据app的安全要求选择其中两个方法的一种对是否存在录屏进程进行判断。1-4键盘按键随机布局该过程通过对键盘上的按键布局进行随机化处理,有效防止攻击者通过用户点击的坐标推断出按键信息,其基本原理是将所有字符按照标准键盘排布的顺序加入到数组中,然后对该数组进行随机排列处理如图4所示。首先创建一个标准键盘数组保存原键盘布局信息,然后使用arc4random函数产生0到标准键盘数组总个数中的随机数,再创建一个数组保存随机后的数组,将随机数k作为标准键盘数组的下标,顺序放入随机以后的数组中,为了防止下次删除数组越界,将标准键盘数组中最后的元素放入刚取出的位置,并删除最后一个元素,如此循环,直至标准键盘数组为空,键盘随机排序完成。1-5键盘和输入信息显示本过程为显示安全键盘显示的过程。本发明提出的安全键盘是基于uiview和uibutton两种控件实现,具体实现如下:①将键盘字符数组使用uibutton控件显示,并使用xib模板来实现uibutton布局,如图5所示。②创建保存uibutton点击输入的字符数组。③对每一个uibutton控件添加点击事件,并再创建一个新数组保存点击uibutton对应的字符。④将字符数组合并成字符串,ios负责系统输入的主要控件有uitextfield和uitextview,所以在uitextfield中的text属性中提取字符,合并成字符串,即实现了键盘输入信息的显示。步骤2、用户数据安全保存2-1sqlite数据库安全存储本发明对sqlite数据库加密提供两种方案:①首先对数据进行加密,加密以后再保存到数据库当中。②将数据库sqlite文件转换成二进制,对sqlite的二进制文件进行加密,如图6所示,开发者可以根据需求进行调用。(1)对数据库中的数据进行加密该方法实现包括数据加密模块、解密模块和数据库读写三部分。数据加解密采用ios自带的加密框架commoncryptor进行加密,该框架提供多种对称加密算法,同一时间内,开启多个线程供不同的commoncryptor对象进行使用,且保证线程安全。首先使用getcstring函数转将字符串密钥转换成aes密钥的形式,buffer代表申请保存密文的空间,然后调用ios中commoncrypor中的aes加密函数进行加密,最后以nsdata数据类型返回密码。另外,数据库写入模块本文使用fmdb,它是一款简洁、易用的数据库封装库,其本质是对libsqlite3框架进行封装,并且它对于多线程的并发操作进行了处理,所以是线程安全的。(2)对数据库文件进行加密该方法使用sqlcipher框架进行加密,该框架是第三方开源的,具有跨平台,加密效率高的优点。首先输入数据库地址,然后创建sqlite数据库,用sqlite3_exec函数进行加密。2-2文件安全存储对于小文件,因为其内存小可直接使用对称密钥进行加密,加密过程如图7中①所示:因为文件类型多种多样,需要将各类型的文件转换成统一的二进制数据格式,在object-c中,nsdata是对数据进行包装的对象,其以二进制数据格式保存在应用当中,它屏蔽了数据之间的差异,文本、音频、图像等数据都可使用nsdata存储。把文件转换成二进制文件以后,使用非对称加密算法对二进制文件进行加密,因为aes是机密性好,加密效率高,所以本文采用aes算法对文件进行加密。另外,在加密的过程密钥是加密过程安全的保障,本文中的密钥可以由开发人员在开发阶段保存在app中,也可以由用户输入。对于视频,音频等大文件,由于移动端计算能力不高,如果直接转成nsdata后加解密,不仅需要等待较多时间,而且消耗大量cpu和内存进行计算。针对该问题,本文提出的解决方案如图7中②所示:使用ios系统提供的压缩api(createzipfileatpath)对文件进行压缩,然后选择文件对应编码方式使用datausingencoding方法将文件转化成nsdata,最后使用base64编码进行加密。步骤3、app应用敏感数据安全保存3-1安全plist文件保护对于开发者自己创建的plist文件,可直接转为字符串进行加密处理,使用mainbundle方法找到app文件中开发者创建的plist文件地址,调用stringwithcontentsofurl将plist文件中的内容转化成nsstring字符串格式,然后使用aes进行加密,并把密文写入ciphertext文档中,最后,使用nsfilemanager文件管理者对象删除原plist文件。步骤4、代码混淆加固本发明提出的app源代码代码混淆分为关键字提取,创建数据库,混淆三个步骤,下文对这三步进行详细描述。4-1关键字提取在ios应用编写过程中,其存在文件名,类名,协议名,函数名四类关键字,该过程需要对这四类关键字进行准确提取。(1)文件名获取:在一个ios应用中包含.framework、.a、.m、.h等类型的文件,其中.framework和.a属于框架型文件是公开的,不需要对其进行混淆,本文的目标是对”.h”和”.m”文件进行混淆。在shell命令中,可以使用find命令获取工程目录下所有的文件。find$rootfolder-typef|sed"//\./d">f.list然后使用cat指令从文件中提取文件名。catf_rep.list|awk-f/'{print$nf;}'|awk-f.'{print$1;}'|sed"/^$/d"|sort|uniq)(2)类名获取:在object-c中,.h文件声明了所有的方法名,.m文件实现.h中声明的方法。该步骤需要提取.h和.m所有的方法名,使用“@interface”字段快速定位到类名,使用grep指令其中sort参数为了排序;因为.h和.m中方法名会重复,所以加入uniq参数去重。(3)协议名获取:在object-c中,协议是一种特殊的程序设计结构,用于声明专门被别的类实现的方法。可以使用“@protocol”关键字,从.h文件中提取出所有协议。(4)函数名获取:在object-c中,函数名以“-()”开头,并以“;”或者“{”结尾,因此,以“-()”和”;”,”{”为关键字,提出两个关键字中的内容,并去除内容中变量名即为函数名,但是,”.h”可能存在”.m”中函数名的声明,两个文件找到的函数名可能会重复,所以需要加入uniq关键字去重。4-2创建数据库本发明采用sqlite数据库来保存关键字,sqlite具有支持多个主流的操作系统;其核心引擎本身不依赖第三方软件;不需要安装;所有信息(例如表,视图,触发器等)都包含在一个文件内等优点。创建对应表的字段如下,src保存原关键字,des保存混淆后名字。表4-1混淆数据库表src原关键字des混淆后的关键字4-3对关键字进行混淆为满足混淆后的关键字不可逆,且长度相同的需求,文本采用md5算法对原关键字进行混淆,该算法具有压缩性、计算效率高、抗修改性、强抗碰撞的特点,符合混淆不可逆且安全的需求。其实现过程如下:首先提取数据库中的src字段内容,调用shell命中的md5sum函数对src中的内容进行md5计算,完成后将md5值存入des字段,其代码如下:echo-n'需要混淆的字符串'|md5sum|cut-d”-f1步骤5、安全热更新5-1热更新脚本安全下发在应用请求服务器更新脚本时,因为javascript脚本可以调用任意object-c方法,权限非常大,如果传输过程代码被攻击获取或篡改,对app会造成较大的威胁。另外,脚本中可能包含应用敏感信息,所以脚本内容也必须具有保密性,本发明设计的热更新脚本安全下发方案如图8所示,设计传输过程如下:①使用一个会话秘钥key对脚本文件进行加密,得到加密脚本。②对脚本文件进行一次md5运算,得到脚本文件的信息摘要。③使用服务器的私钥对会话秘钥key进行加密,得到加密key。④同时也用私钥对过程②的md5值进行加密,得到加密md5。⑤将加密key,加密脚本,以及加密md5发送至客户端。⑥客户端使用服务器公钥对加密key进行解密,得到key。⑦客户端使用公对加密md5解密,得到md5。⑧使用key解密得到脚本文件。⑨客户端对脚本文件进行一次md5操作。⑩对比过程⑦和过程⑨中的md5,判断脚本在传输过程中是否遭到修改。本发明使用https传输协议对以上过程进行实现。5-2热更新脚本本地安全针对脚本文件在本地存在被篡改的威胁,本发明提出了以下方案如图9所示。当客户端调用脚本文件时,本方法会对脚本文件进行一次md5计算,并将计算结果发送至服务器进行验证,即在5-1过程⑤加入脚本安全验证的过程,只有服务器验证通过,才可以执行脚本文件中的内容。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1