首页 > 专利 > 杭州电子科技大学 > 一种iOS下移动APP安全防护系统及方法专利详情

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

有效专利 查看PDF
专利申请流程有哪些步骤?
专利申请流程图
申请
申请号:指国家知识产权局受理一件专利申请时给予该专利申请的一个标示号码。唯一性原则。
申请日:提出专利申请之日。
2018-03-15
申请公布
申请公布指发明专利申请经初步审查合格后,自申请日(或优先权日)起18个月期满时的公布或根据申请人的请求提前进行的公布。
申请公布号:专利申请过程中,在尚未取得专利授权之前,国家专利局《专利公报》公开专利时的编号。
申请公布日:申请公开的日期,即在专利公报上予以公开的日期。
2018-10-26
授权
授权指对发明专利申请经实质审查没有发现驳回理由,授予发明专利权;或对实用新型或外观设计专利申请经初步审查没有发现驳回理由,授予实用新型专利权或外观设计专利权。
2020-06-30
预估到期
发明专利权的期限为二十年,实用新型专利权期限为十年,外观设计专利权期限为十五年,均自申请日起计算。专利届满后法律终止保护。
2038-03-15
基本信息
有效性 有效专利 专利类型 发明专利
申请号 CN201810215031.7 申请日 2018-03-15
公开/公告号 CN108595989B 公开/公告日 2020-06-30
授权日 2020-06-30 预估到期日 2038-03-15
申请年 2018年 公开/公告年 2020年
缴费截止日
分类号 G06F21/83G06F21/62H04L9/06H04L9/08H04L29/06 主分类号 G06F21/83
是否联合申请 独立申请 文献类型号 B
独权数量 1 从权数量 1
权利要求数量 2 非专利引证数量 1
引用专利数量 4 被引证专利数量 0
非专利引证 1、JunLiang Liu等《.A digital memoriesbased user authentication scheme withprivacy preservation》《.PLOS ONE》.2017,陈佳霖《.iOS系统数据安全研究》《.信息安全于通信保密》.2012,(第08期),;
引用专利 CN104469767A、CN102737190A、CN102760219A、WO2015196982A1 被引证专利
专利权维持 4 专利申请国编码 CN
专利事件 事务标签 公开、实质审查、授权
申请人信息
申请人 第一申请人
专利权人 杭州电子科技大学 当前专利权人 杭州电子科技大学
发明人 吕秋云、祁伊祯、俞祥祥、王秋华、欧阳潇琴、詹佳程、刘昊 第一发明人 吕秋云
地址 浙江省杭州市下沙高教园区2号大街 邮编 310018
申请人数量 1 发明人数量 7
申请人所在省 浙江省 申请人所在市 浙江省杭州市
代理人信息
代理机构
专利代理机构是经省专利管理局审核,国家知识产权局批准设立,可以接受委托人的委托,在委托权限范围内以委托人的名义办理专利申请或其他专利事务的服务机构。
杭州君度专利代理事务所 代理人
专利代理师是代理他人进行专利申请和办理其他专利事务,取得一定资格的人。
朱月芬
摘要
本发明公开了一种iOS下移动APP安全防护系统及方法。本发明包括安全键盘模块、用户数据安全保存模块、App敏感信息保存模块、源代码保护模块、安全热更新模块的五大安全防护模块对于现有的iOS移动APP存在缺陷和问题进行安全防护。本发明将现存iOS‑App开发过程中常遇到的五个安全问题的解决方案集成到一种安全防护框架方法当中,开发者只需要将安全防护方法运用到App中,正确部署即可对App做出有效的安全防护,方便开发者解决App安全问题,减少开发时间,提高App的安全性。
  • 摘要附图
    一种iOS下移动APP安全防护系统及方法
法律状态
序号 法律状态公告日 法律状态 法律状态信息
1 2020-06-30 授权
2 2018-10-26 实质审查的生效 IPC(主分类): G06F 21/83 专利申请号: 201810215031.7 申请日: 2018.03.15
3 2018-09-28 公开
权利要求
权利要求书是申请文件最核心的部分,是申请人向国家申请保护他的发明创造及划定保护范围的文件。
1.一种iOS下移动APP安全防护系统,其特征在于包括安全键盘模块、用户数据安全保存模块、App敏感信息保存模块、源代码保护模块、安全热更新模块;
安全键盘模块:具有防通过坐标获取键盘输入信息、去缓存和防录屏的功能,将自定义的安全键盘模块代替原系统键盘,并通过runtime机制对录屏进程的监听,有效阻止用户输入信息的泄露;
安全键盘模块启动实现过程如下:
①监听用户输入事件;
②拦截系统键盘弹出;
③检测是否在录屏的进程,若发现正在录屏,则弹出警告并收回安全键盘模块;否则启动安全键盘模块,产生一组随机数,将键盘中的键位随机布局;
④键盘根据布局模板进行显示,点击键盘按键显示输入信息;
用户数据安全保存模块:对用户数据进行分类保存,根据不同数据类型以及大小不同给出不同的加密方案;将用户数据分为以下两类:
①用户字段信息,该类型数据量小,并有数据处理的需求,该类数据使用SQLite数据进行保存,大部分SQLite文件会保存Document当中;
②用户处理的文件数据,该类数据因为内存大,直接保存在Documents或Library当中;
针对这两类数据提出相应地安全保存的方法,针对SQLite数据库中用户字段信息的安全存储,提供两种加密方案:
①对数据进行加密,加密以后再保存到数据库当中;
②将数据库sqlite文件转换成二进制,对sqlite的二进制文件进行加密,开发者可以根据需求进行调用;
针对文件安全存储加密方案如下:
首先将用户文件根据文件内存大小,分成小文件和大文件;
对于小文件,因为其内存小直接使用对称密钥进行加密;
对于视频、音频的大文件,首先使用压缩方法对文件进行压缩,然后选择文件对应编码方式使用dataUsingEncoding方法将文件转化成NSData,最后使用base64编码进行加密;
App敏感信息保存模块:实现了SSkeychain安全存储容器,并对plist文件进行加密,具体如下:
首先,安全plist文件保存;
App中的plist文件分成两类,一类为系统自带的info.Plist文件,其中包含了一些应用配置信息,另一类则是开发者自己创建的plist文件;
对于第一类文件直接使用用户数据安全保存模块中的用户字段信息加密API进行加密;
对于第二类文件,因为plist是以XML明文的形式进行保存,直接转为字符串进行加密处理;
其次,使用SSkeychain保存信息;
Keychain Services是OSX和iOS都提供的一种安全地存储敏感信息的工具,对于keychain源代码进行封装,创建了SSKeychain工具类,头文件定义了三个方法:keychain保存、读取和删除数据;然后在实现文件中将定义的三个方法抽成一个方法类;
所述的敏感信息包含用户数据安全保存模块中加密使用的密钥、集成第三方SDK的AppId和AppSecret,以及应用的网络接口信息;
源代码保护模块:对App应用源码中的文件名、方法名和类名进行混淆,分为关键字提取、创建数据库和关键字混淆,具体如下:
首先,关键字提取
在iOS应用编写过程中,对存在的文件名、类名、协议名和函数名四类关键字进行准确提取;
其次,创建数据库
采用SQLite数据库来保存关键字,创建对应表的字段表,字段表包括src和des;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,判断脚本在传输过程中是否遭到修改;
其次,热更新脚本本地安全
当本地客户端调用脚本文件时,首先对脚本文件进行一次MD5计算,然后将计算结果发送至服务器进行验证,即在热更新脚本安全下发过程⑤加入脚本安全验证的过程,只有服务器验证通过,才可以执行脚本文件中的内容。

2.根据权利要求1所述的一种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(第一响应者)的属性,当用户点击输入框时,系统先调用resign FirstResponder方法取消UITextField第一次响应者的属性,当该属性被取消,系统键盘便会隐藏,达到阻止系统键盘弹出目的;
1-3检测是否存在录屏进程
该过程检测是否存在录屏进程的调用,如果存在则停止安全键盘启动,并通知用户存在恶意录屏;
检测App是否存在录屏进程的实现方法有以下两种:
①.遍历App应用的所有framework,检测是否包含了ReplayKit框架;在iOS系统中,App的可执行文件以mach-O格式进行保存,App在启动时通过load Commands将所有框架动态链接到App中,遍历mach-O文件中load commands,判断App是否包含Replaykit框架,通过检测整个App是否调用replaykit的方式来判断是否存在录屏进程;
②.通过检测Replaykit的方法调用判断是否存在录屏进程,运行时再次判断,进一步消除步骤①的误差;具体如下:在Object-C中一个类的数据结构为结构体,包含了类名name和其所有的方法名数组method_list,所以该检测过程只需要遍历method_list方法列表中所有的方法名,即能够判断是否存在恶意调用录屏进程监听键盘输入;实现过程如下:在Replaykit中RPScreenRecord是录屏功能的操作对象,其中inti方法为RPScreenRecorder对象的创建方法,startRecordingWithMicrophone是RPScreenRecorder启动录屏方法;
使用runtime机制,遍历RPScreenRecorder对象中所有方法是否存创建和启动录屏两个方法,可达到判断是否存在录屏进程的目的;
1-4键盘按键随机布局
通过对键盘上的按键布局进行随机化处理,有效防止攻击者通过用户点击的坐标推断出按键信息:
首先创建一个标准键盘数组保存原键盘布局信息,然后使用arc4random函数产生0到标准键盘数组总个数中的随机数,再创建一个数组保存随机后的数组,将随机数K作为标准键盘数组的下标,顺序放入随机以后的数组中,为了防止下次删除数组越界,将标准键盘数组中最后的元素放入刚取出的位置,并删除最后一个元素,如此循环,直至标准键盘数组为空,键盘随机排序完成;
1-5键盘和输入信息显示
安全键盘是基于UIView和UIButton两种控件实现,具体实现如下:
①将键盘字符数组使用UIButton控件显示,并使用xib模板来实现UIButton布局;
②创建保存UIButton点击输入的字符数组;
③对每一个UIButton控件添加点击事件,并再创建一个新数组保存点击UIButton对应的字符;
④将字符数组合并成字符串,iOS负责系统输入的主要控件有UITextField和
UITextView,所以在UITextField中的text属性中提取字符,合并成字符串,即实现了键盘输入信息的显示;
步骤2、用户数据安全保存
2-1SQLite数据库安全存储
对SQLite数据库加密提供两种方案:①首先对数据进行加密,加密以后再保存到数据库当中;②将数据库sqlite文件转换成二进制,对sqlite的二进制文件进行加密;
(1)对数据库中的数据进行加密
具体包括数据加密模块、解密模块和数据库读写三部分;数据加解密采用iOS自带的加密框架CommonCryptor进行加密,该框架提供多种对称加密算法,同一时间内,开启多个线程供不同的CommonCryptor对象进行使用,且保证线程安全;
首先使用getCString函数转将字符串密钥转换成AES密钥的形式,buffer代表申请保存密文的空间,然后调用iOS中CommonCrypor中的AES加密函数进行加密,最后以NSData数据类型返回密码;另外,数据库写入模块使用FMDB;
(2)对数据库文件进行加密
使用sqlcipher框架进行加密:首先输入数据库地址,然后创建SQLite数据库,用sqlite3_exec函数进行加密;
2-2文件安全存储
对于小文件,因为其内存小可直接使用对称密钥进行加密,加密过程如下:将各类型的文件转换成统一的二进制数据格式,在Object-C中,NSData是对数据进行包装的对象,其以二进制数据格式保存在应用当中;
把文件转换成二进制文件以后,使用非对称加密算法对二进制文件进行加密;另外,在加密的过程密钥是加密过程安全的保障,密钥由开发人员在开发阶段保存在App中,或由用户输入;
对于大文件,使用iOS系统提供的压缩API对文件进行压缩,然后选择文件对应编码方式使用dataUsingEncoding方法将文件转化成NSData,最后使用base64编码进行加密;
步骤3、App应用敏感数据安全保存
3-1安全plist文件保护
对于开发者自己创建的plist文件,可直接转为字符串进行加密处理,使用mainBundle方法找到App文件中开发者创建的plist文件地址,调用stringWithContentsOfURL将plist文件中的内容转化成NSString字符串格式,然后使用AES进行加密,并把密文写入ciphertext文档中,最后,使用NSFileManager文件管理者对象删除原plist文件;
步骤4、代码混淆加固
具体分为关键字提取、创建数据库和关键字混淆,详细描述如下:
4-1关键字提取
在iOS应用编写过程中,其存在文件名、类名、协议名和函数名四类关键字,该过程需要对这四类关键字进行准确提取;
(1)文件名获取:在shell命令中,使用find命令获取工程目录下所有的文件;然后使用cat指令从文件中提取文件名;
(2)类名获取:使用“@interface”字段快速定位到类名,使用grep指令其中sort参数为了排序;加入uniq参数去重;
(3)协议名获取:使用“@protocol”关键字,提取出所有协议;
(4)函数名获取:在Object-C中,函数名以“-()”开头,并以“;”或者“{”结尾,因此,以“-()”和”;”,”{”为关键字,提出两个关键字中的内容,并去除内容中变量名即为函数名,同时加入uniq关键字去重;
4-2创建数据库
采用SQLite数据库来保存关键字,创建对应表的字段表,字段表包括src和des;src保存原关键字,des保存混淆后名字;
4-3对关键字进行混淆
采用MD5算法对原关键字进行混淆,其实现过程如下:首先提取数据库中的src字段内容,调用shell命中的md5sum函数对src中的内容进行MD5计算,完成后将MD5值存入des字段;
步骤5、安全热更新
5-1热更新脚本安全下发
传输过程如下:
①使用一个会话秘钥key对脚本文件进行加密,得到加密脚本;
②对脚本文件进行一次MD5运算,得到脚本文件的信息摘要;
③使用服务器的私钥对会话秘钥key进行加密,得到加密key;
④同时也用私钥对过程②的MD5值进行加密,得到加密MD5;
⑤将加密key,加密脚本,以及加密MD5发送至客户端;
⑥客户端使用服务器公钥对加密key进行解密,得到key;
⑦客户端使用公对加密MD5解密,得到MD5;
⑧使用key解密得到脚本文件;
⑨客户端对脚本文件进行一次MD5操作;
⑩对比过程⑦和过程⑨中的MD5,判断脚本在传输过程中是否遭到修改;
5-2热更新脚本本地安全
针对脚本文件在本地存在被篡改的威胁,当客户端调用脚本文件时,首先对脚本文件进行一次MD5计算,然后将计算结果发送至服务器进行验证,即在步骤5-1过程⑤加入脚本安全验证的过程,只有服务器验证通过,才可以执行脚本文件中的内容。
说明书

技术领域

[0001] 本发明属于移动安全的技术领域,具体为一种iOS下移动APP安全防护方法。技术背景
[0002] iOS和Android是用户使用率最高的移动操作系统,其中iOS系统源码不公开,以及严格统一的App应用上架审核机制,比Android具有较高的安全性;另外,苹果公司为iOS系统设计了一系列安全机制,如:代码签名、沙盒机制、ASLP、加密保护等。
[0003] 虽然iOS有较完善的安全机制,但是因为开发者对应用安全的疏忽,还是存在一些常见的安全威胁。本方法主要针对开发中常遇到的五个安全威胁进行防护:
[0004] (1)系统键盘安全威胁,用户在使用App时,经常会遇到账户密码输入等敏感信息输入问题,特别是针对金融类App,防止键盘输入内容被监听,对用户数据的保护非常重要。
[0005] (2)用户数据本地保存安全威胁,用户在使用App时会产生许多用户信息,一部分数据采用数据库的形式进行保存,另外一部分数据以word,PDF等大文件的形式保存在本地App中,这些数据如果没有防护措施,易造成数据泄露。
[0006] (3)App敏感信息保存安全威胁,在日常开发过程中,避免不了对一些App敏感信息的处理例如App加密密钥,多数开发者采用硬编码形式或plist文件进行保存,但是其存在巨大的安全隐患,一旦App被逆向,以上信息都会遭到泄露。
[0007] (4)App源代码泄露威胁,在日常开中,因为苹果现有的安全加固技术,开发者容易忽视对App源代码进行保护,攻击者可以通过逆向的方法从源代码中得到通信协议或者代码逻辑,对App进行攻击。
[0008] (5)热更新脚本篡改威胁,为了满足快速变化的需求,热更新技术已经被众多App使用,但是热更新脚本代码的获取与保存还存在一些安全问题。

发明内容

[0009] 本发明的目的是针对现有技术的不足,提供一种iOS下移动APP安全防护系统及方法。
[0010] 本发明解决其技术问题所采用的技术方案如下:
[0011] 一种iOS下移动APP安全防护系统,包括安全键盘模块、用户数据安全保存模块、App敏感信息保存模块、源代码保护模块、安全热更新模块;
[0012] 安全键盘模块:具有防通过坐标获取键盘输入信息、去缓存和防录屏的功能,将自定义的安全键盘模块代替原系统键盘,并通过runtime机制对录屏进程的监听,有效阻止用户输入信息的泄露。安全键盘模块启动实现过程如下:
[0013] ①监听用户输入事件。
[0014] ②拦截系统键盘弹出。
[0015] ③检测是否在录屏的进程,若发现正在录屏,则弹出警告并收回安全键盘模块;否则启动安全键盘模块,产生一组随机数,将键盘中的键位随机布局。
[0016] ④键盘根据布局模板进行显示,点击键盘按键显示输入信息。
[0017] 用户数据安全保存模块:对用户数据进行分类保存,根据不同数据类型以及大小不同给出不同的加密方案。将用户数据分为以下两类:
[0018] ①用户字段信息,例如用户名,密码等,该类型数据量小,并有数据处理的需求:例如排序,取最大数等,该类数据一般使用SQLite数据进行保存,大部分SQLite文件会保存Document当中。
[0019] ②用户处理的文件数据,例如word,PPT,视频文件等,该类数据因为内存大,直接保存在Documents或Library当中,针对这两类数据提出相应地安全保存的方法。
[0020] 针对SQLite数据库中用户字段信息的安全存储,提供两种加密方案:
[0021] ①对数据进行加密,加密以后再保存到数据库当中。
[0022] ②将数据库sqlite文件转换成二进制,对sqlite的二进制文件进行加密,开发者可以根据需求进行调用。
[0023] 针对文件安全存储加密方案如下:
[0024] 首先将用户文件根据文件内存大小,分成小文件和大文件;
[0025] 对于小文件,因为其内存小可直接使用对称密钥进行加密。
[0026] 对于视频、音频等大文件,由于移动端计算能力不高,如果直接转成NSData后加解密,不仅需要等待较多时间,而且消耗大量CPU和内存进行计算。因此本发明首先使用压缩方法对文件进行压缩,然后选择文件对应编码方式使用dataUsingEncoding方法将文件转化成NSData,最后使用base64编码进行加密。
[0027] App敏感信息保存模块:实现了SSkeychain安全存储容器,并对plist文件进行加密,具体如下:
[0028] 首先,安全plist文件保存
[0029] App中的plist文件分成两类,一类为系统自带的info.Plist文件,其中包含了一些应用配置信息,例如应用名,应用版本号等等,另一类则是开发者自己创建的plist文件。
[0030] 对于第一类文件,因为含有系统信息,如果对其加密,系统则无法识别内容而导致App崩溃,所以不能直接对inof.plist进行加密,该过程可以直接使用用户数据安全保存模块中的用户字段信息加密API进行加密。
[0031] 对于第二类文件,因为plist是以XML明文的形式进行保存,可直接转为字符串进行加密处理。
[0032] 其次,使用SSkeychain保存信息
[0033] Keychain Services是OSX和iOS都提供的一种安全地存储敏感信息的工具,比如:存储用户ID、密码和证书等。由于keychain方法的代码冗余度高,可读性差,因此在keychain的基础上设计了SSKeychain,对keychain的方法类进行封装,大大方便开发者对keychain的使用。
[0034] 本发明设计对于keychain源代码进行封装,创建了SSKeychain工具类,头文件定义了三个方法:keychain保存、读取和删除数据;然后在实现文件中将定义的三个方法抽成一个方法类;以存储方法为例,每一个存储方法唯一不同的是存储的键key和键值value不一样,而其他的调用查看是否已存在,更新键值,创建新键值对的方法都是一样的。
[0035] 所述的敏感信息包含用户数据安全保存模块中加密使用的密钥、集成第三方SDK的AppId和AppSecret,以及应用的网络接口等信息。
[0036] 源代码保护模块:对App应用源码中的文件名、方法名和类名等进行混淆,分为关键字提取、创建数据库和混淆,具体如下:
[0037] 首先,关键字提取
[0038] 在iOS应用编写过程中,对存在的文件名、类名、协议名和函数名四类关键字进行准确提取。
[0039] 其次,创建数据库
[0040] 本发明采用SQLite数据库来保存关键字,SQLite具有支持多个主流的操作系统;其核心引擎本身不依赖第三方软件;不需要安装;所有信息(例如表,视图,触发器等)都包含在一个文件内等优点。创建对应表的字段如下4-1表,src保存原关键字,des保存混淆后名字。
[0041] 表4-1混淆数据库表
[0042]src原关键字 des混淆后的关键字
[0043] 然后,对关键字进行混淆
[0044] 本发明采用MD5算法对原关键字进行混淆,该算法具有压缩性、计算效率高、抗修改性、强抗碰撞的特点,符合混淆不可逆且安全的需求。其实现过程如下:首先提取数据库中的src字段内容,调用shell命中的md5sum函数对src中的内容进行MD5计算,完成后将MD5值存入des字段。
[0045] 安全热更新模块:热更新脚本使用https协议进行传输,本地执行的热更新脚本代码使用哈希算法验证其完整性,具体实现如下:
[0046] 首先,热更新脚本安全下发
[0047] 本发明热更新脚本安全传输过程如下:
[0048] ①使用一个会话秘钥key对脚本文件进行加密,得到加密脚本。
[0049] ②对脚本文件进行一次MD5运算,得到脚本文件的信息摘要。
[0050] ③使用服务器的私钥对会话秘钥key进行加密,得到加密key。
[0051] ④同时也用私钥对过程②的MD5值进行加密,得到加密MD5。
[0052] ⑤将加密key、加密脚本以及加密MD5发送至客户端。
[0053] ⑥客户端使用服务器公钥对加密key进行解密,得到key。
[0054] ⑦客户端使用服务器公钥加密MD5解密,得到MD5。
[0055] ⑧使用key解密得到脚本文件。
[0056] ⑨客户端对脚本文件进行一次MD5操作。
[0057] ⑩对比过程⑦和过程⑨中的MD5,判断脚本在传输过程中是否遭到修改。
[0058] 本发明使用https传输协议对以上过程进行实现。
[0059] 其次,热更新脚本本地安全
[0060] 当本地客户端调用脚本文件时,本方法会对脚本文件进行一次MD5计算,并将计算结果发送至服务器进行验证,即在热更新脚本安全下发过程⑤加入脚本安全验证的过程,只有服务器验证通过,才可以执行脚本文件中的内容。
[0061] 本发明有益效果如下:
[0062] 本发明研究分析了现有分析了iOS-App开发过程中常遇到的五个安全问题,提出了一种iOS-App安全防护方法。该发明将五个安全威胁的解决方案集成到一种安全防护框架方法中,开发者只需要将安全防护方法运用到App中,正确部署即可对App做出有效的安全防护,方便开发者解决App安全问题,减少开发时间,提高App的安全性。

实施方案

[0072] 为使本发明实现的技术手段、创作特征、达成目的与功效易于明白了解,下面结合附图对本发明作进一步的说明。
[0073] 如图1所示,一种iOS下移动APP安全防护系统主要包含以下五个安全模块:键盘信息的安全输入模块、用户数据安全存储模块、应用敏感信息安全保存模块、代码混淆模块和安全热更新模块。以下对各模块进行详细描述:
[0074] (1)安全键盘模块:该功能包括防攻击者通过点击坐标获取输入信息攻击,防止键盘缓存保存用户敏感信息,以及键盘信息输入时录屏接口的监听。
[0075] (2)用户数据安全保存模块:该模块功能对常用的本地存储数据文件类型进行了安全保护,包括数据库文件和普通文件。
[0076] (3)应用敏感信息安全保存模块:针对应用敏感信息,设计实现SSKeychain对应用敏感信息进行保存,另外,对保存应用信息plist文件也进行加密。
[0077] (4)代码混淆模块:该模块功能对应用源代码进行混淆,包括方法名混淆,类名混淆和文件名混淆。
[0078] (5)安全热更新模块:该模块对热更新脚本从服务器安全获取和本地安全保存。
[0079] 一种iOS下移动APP安全防护系统的实现方法,具体包括如下步骤:
[0080] 步骤1.启动安全键盘模块,具体实现如图2:
[0081] 1-1监听用户输入事件
[0082] 该过程为当用户使用UITextfield控件输入信息时,监听键盘的弹出事件,其主要实现方法是使用KVO技术监听键盘弹出。
[0083] 其实现过程如下:
[0084] 首先创建一个观察者,;
[0085] 然后给观察者添加观察内容,键盘的监听事件有四种状态:
[0086] UIKeyboardWillShowNotification键盘即将显示;
[0087] UIKeyboardDidShowNotifition键盘已经显示;
[0088] UIKeyboardWillHideNotification键盘即将隐藏;
[0089] UIKeyboardDidHideNotification键盘完全隐藏;
[0090] 本文需要监听UIKeyboardWillShowNotification键盘即将显示事件,添加完成后,即完成了对键盘输入的监听。在控制器viewDidLoad方法中使用addObserver添加观察者,@selector代表观察者触发事件后回调后方法,name代表观察者的触发事件,本过程主要对键盘即将显示事件进行观察。
[0091] 1-2拦截系统键盘显示
[0092] 当UIKeyboardWillShowNotification键盘即将显示事件触发时,系统会直接调用系统keyboard进行显示,为了能够显示本文设计的安全键盘,需要对系统键盘进行拦截,并替换成安全键盘,在步骤1-1中的keyboardWillShow方法中添加拦截代码即可实现系统键盘的拦截。
[0093] 其具体实现过程如下:在iOS系统中支持键盘输入的控件有UITextfield和UITextView,在这两个控件中有FirstResponder(第一响应者)的属性,当用户点击输入框时,系统先调用resign FirstResponder方法取消UITextField第一次响应者的属性,当该属性被取消,系统键盘便会隐藏,达到阻止系统键盘弹出目的。
[0094] 1-3检测是否存在录屏进程
[0095] 该过程检测是否存在录屏进程的调用,如果存在则停止安全键盘启动,并通知用户存在恶意录屏。
[0096] 检测App是否存在录屏进程的实现方法有以下两种:
[0097] 1.遍历App应用的所有framework,检测是否包含了ReplayKit框架。在iOS系统中,App的可执行文件以mach-O格式进行保存,其文件结构如图3所示,App在启动时通过load Commands将所有框架(例libobjc.A.dylib,libsystem等)动态链接到App中,遍历mach-O文件中load commands,判断App是否包含Replaykit框架。该方法通过检测整个App是否调用replaykit的方式来判断是否存在录屏进程,判断过于严格,易于造成误判。
[0098] 2.通过检测Replaykit的方法调用判断是否存在录屏进程,运行时再次判断,进一步消除上述方法的误判。其原理是:Object-C是动态语言,程序中的方法调用不是编译时决定,而是运行时,其动态性实现的主要技术是Runtime机制,简称运行时,是一套由纯C代码编写的API,在Object-C中一个类的数据结构为结构体如下代码所示,其中包含了类名name和其所有的方法名数组method_list,所以该检测过程只需要遍历method_list方法列表中所有的方法名,即可以判断是否存在恶意调用录屏进程监听键盘输入;其主要实现过程如下:在Replaykit中RPScreenRecord是录屏功能的操作对象,其中inti方法为RPScreenRecorder对象的创建方法,startRecordingWithMicrophone是RPScreenRecorder启动录屏方法。本文在安全启动时,使用runtime机制,遍历RPScreenRecorder对象中所有方法是否存创建和启动录屏两个方法,可达到判断是否存在录屏进程的目的。
[0099] 开发者可以根据App的安全要求选择其中两个方法的一种对是否存在录屏进程进行判断。
[0100] 1-4键盘按键随机布局
[0101] 该过程通过对键盘上的按键布局进行随机化处理,有效防止攻击者通过用户点击的坐标推断出按键信息,其基本原理是将所有字符按照标准键盘排布的顺序加入到数组中,然后对该数组进行随机排列处理如图4所示。
[0102] 首先创建一个标准键盘数组保存原键盘布局信息,然后使用arc4random函数产生0到标准键盘数组总个数中的随机数,再创建一个数组保存随机后的数组,将随机数K作为标准键盘数组的下标,顺序放入随机以后的数组中,为了防止下次删除数组越界,将标准键盘数组中最后的元素放入刚取出的位置,并删除最后一个元素,如此循环,直至标准键盘数组为空,键盘随机排序完成。
[0103] 1-5键盘和输入信息显示
[0104] 本过程为显示安全键盘显示的过程。本发明提出的安全键盘是基于UIView和UIButton两种控件实现,具体实现如下:
[0105] ①将键盘字符数组使用UIButton控件显示,并使用xib模板来实现UIButton布局,如图5所示。
[0106] ②创建保存UIButton点击输入的字符数组。
[0107] ③对每一个UIButton控件添加点击事件,并再创建一个新数组保存点击UIButton对应的字符。
[0108] ④将字符数组合并成字符串,iOS负责系统输入的主要控件有UITextField和UITextView,所以在UITextField中的text属性中提取字符,合并成字符串,即实现了键盘输入信息的显示。
[0109] 步骤2、用户数据安全保存
[0110] 2-1SQLite数据库安全存储
[0111] 本发明对SQLite数据库加密提供两种方案:①首先对数据进行加密,加密以后再保存到数据库当中。②将数据库sqlite文件转换成二进制,对sqlite的二进制文件进行加密,如图6所示,开发者可以根据需求进行调用。
[0112] (1)对数据库中的数据进行加密
[0113] 该方法实现包括数据加密模块、解密模块和数据库读写三部分。数据加解密采用iOS自带的加密框架CommonCryptor进行加密,该框架提供多种对称加密算法,同一时间内,开启多个线程供不同的CommonCryptor对象进行使用,且保证线程安全。
[0114] 首先使用getCString函数转将字符串密钥转换成AES密钥的形式,buffer代表申请保存密文的空间,然后调用iOS中CommonCrypor中的AES加密函数进行加密,最后以NSData数据类型返回密码。另外,数据库写入模块本文使用FMDB,它是一款简洁、易用的数据库封装库,其本质是对libsqlite3框架进行封装,并且它对于多线程的并发操作进行了处理,所以是线程安全的。
[0115] (2)对数据库文件进行加密
[0116] 该方法使用sqlcipher框架进行加密,该框架是第三方开源的,具有跨平台,加密效率高的优点。首先输入数据库地址,然后创建SQLite数据库,用sqlite3_exec函数进行加密。
[0117] 2-2文件安全存储
[0118] 对于小文件,因为其内存小可直接使用对称密钥进行加密,加密过程如图7中①所示:因为文件类型多种多样,需要将各类型的文件转换成统一的二进制数据格式,在Object-C中,NSData是对数据进行包装的对象,其以二进制数据格式保存在应用当中,它屏蔽了数据之间的差异,文本、音频、图像等数据都可使用NSData存储。
[0119] 把文件转换成二进制文件以后,使用非对称加密算法对二进制文件进行加密,因为AES是机密性好,加密效率高,所以本文采用AES算法对文件进行加密。另外,在加密的过程密钥是加密过程安全的保障,本文中的密钥可以由开发人员在开发阶段保存在App中,也可以由用户输入。
[0120] 对于视频,音频等大文件,由于移动端计算能力不高,如果直接转成NSData后加解密,不仅需要等待较多时间,而且消耗大量CPU和内存进行计算。针对该问题,本文提出的解决方案如图7中②所示:使用iOS系统提供的压缩API(createZipFileAtPath)对文件进行压缩,然后选择文件对应编码方式使用dataUsingEncoding方法将文件转化成NSData,最后使用base64编码进行加密。
[0121] 步骤3、App应用敏感数据安全保存
[0122] 3-1安全plist文件保护
[0123] 对于开发者自己创建的plist文件,可直接转为字符串进行加密处理,使用mainBundle方法找到App文件中开发者创建的plist文件地址,调用stringWithContentsOfURL将plist文件中的内容转化成NSString字符串格式,然后使用AES进行加密,并把密文写入ciphertext文档中,最后,使用NSFileManager文件管理者对象删除原plist文件。
[0124] 步骤4、代码混淆加固
[0125] 本发明提出的App源代码代码混淆分为关键字提取,创建数据库,混淆三个步骤,下文对这三步进行详细描述。
[0126] 4-1关键字提取
[0127] 在iOS应用编写过程中,其存在文件名,类名,协议名,函数名四类关键字,该过程需要对这四类关键字进行准确提取。
[0128] (1)文件名获取:在一个iOS应用中包含.framework、.a、.m、.h等类型的文件,其中.framework和.a属于框架型文件是公开的,不需要对其进行混淆,本文的目标是对”.h”和”.m”文件进行混淆。在shell命令中,可以使用find命令获取工程目录下所有的文件。
[0129]find $ROOTFOLDER-type f|sed"/\/\./d">f.list
[0130] 然后使用cat指令从文件中提取文件名。
[0131] cat f_rep.list|awk-F/'{print$NF;}'|awk-F.'{print$1;}'|sed"/^$/d"|sort|uniq)[0132] (2)类名获取:在Object-C中,.h文件声明了所有的方法名,.m文件实现.h中声明的方法。该步骤需要提取.h和.m所有的方法名,使用“@interface”字段快速定位到类名,使用grep指令其中sort参数为了排序;因为.h和.m中方法名会重复,所以加入uniq参数去重。
[0133]
[0134] (3)协议名获取:在Object-C中,协议是一种特殊的程序设计结构,用于声明专门被别的类实现的方法。可以使用“@protocol”关键字,从.h文件中提取出所有协议。
[0135]
[0136] (4)函数名获取:在Object-C中,函数名以“-()”开头,并以“;”或者“{”结尾,因此,以“-()”和”;”,”{”为关键字,提出两个关键字中的内容,并去除内容中变量名即为函数名,但是,”.h”可能存在”.m”中函数名的声明,两个文件找到的函数名可能会重复,所以需要加入uniq关键字去重。
[0137]
[0138] 4-2创建数据库
[0139] 本发明采用SQLite数据库来保存关键字,SQLite具有支持多个主流的操作系统;其核心引擎本身不依赖第三方软件;不需要安装;所有信息(例如表,视图,触发器等)都包含在一个文件内等优点。创建对应表的字段如下,src保存原关键字,des保存混淆后名字。
[0140] 表4-1混淆数据库表
[0141]src原关键字 des混淆后的关键字
[0142] 4-3对关键字进行混淆
[0143] 为满足混淆后的关键字不可逆,且长度相同的需求,文本采用MD5算法对原关键字进行混淆,该算法具有压缩性、计算效率高、抗修改性、强抗碰撞的特点,符合混淆不可逆且安全的需求。其实现过程如下:首先提取数据库中的src字段内容,调用shell命中的md5sum函数对src中的内容进行MD5计算,完成后将MD5值存入des字段,其代码如下:
[0144] echo-n'需要混淆的字符串'|md5sum|cut-d”-f1
[0145] 步骤5、安全热更新
[0146] 5-1热更新脚本安全下发
[0147] 在应用请求服务器更新脚本时,因为JavaScript脚本可以调用任意Object-C方法,权限非常大,如果传输过程代码被攻击获取或篡改,对App会造成较大的威胁。另外,脚本中可能包含应用敏感信息,所以脚本内容也必须具有保密性,本发明设计的热更新脚本安全下发方案如图8所示,设计传输过程如下:
[0148] ①使用一个会话秘钥key对脚本文件进行加密,得到加密脚本。
[0149] ②对脚本文件进行一次MD5运算,得到脚本文件的信息摘要。
[0150] ③使用服务器的私钥对会话秘钥key进行加密,得到加密key。
[0151] ④同时也用私钥对过程②的MD5值进行加密,得到加密MD5。
[0152] ⑤将加密key,加密脚本,以及加密MD5发送至客户端。
[0153] ⑥客户端使用服务器公钥对加密key进行解密,得到key。
[0154] ⑦客户端使用公对加密MD5解密,得到MD5。
[0155] ⑧使用key解密得到脚本文件。
[0156] ⑨客户端对脚本文件进行一次MD5操作。
[0157] ⑩对比过程⑦和过程⑨中的MD5,判断脚本在传输过程中是否遭到修改。
[0158] 本发明使用https传输协议对以上过程进行实现。
[0159] 5-2热更新脚本本地安全
[0160] 针对脚本文件在本地存在被篡改的威胁,本发明提出了以下方案如图9所示。当客户端调用脚本文件时,本方法会对脚本文件进行一次MD5计算,并将计算结果发送至服务器进行验证,即在5-1过程⑤加入脚本安全验证的过程,只有服务器验证通过,才可以执行脚本文件中的内容。

附图说明

[0063] 图1总体架构设计图
[0064] 图2安全键盘设计流程图
[0065] 图3Mach-O文件结构图
[0066] 图4安全键盘字符随机化的过程
[0067] 图5安全键盘布局图
[0068] 图6两种用户数据加密的方案
[0069] 图7两种文件存储方案流程图
[0070] 图8热更新代码安全下发流程图
[0071] 图9脚本文件验证过程
版权所有:盲专网 ©2023 zlpt.xyz  蜀ICP备2023003576号