iOS 代码安全
iOS 安全攻防 系列
http://www.cocoachina.com/industry/20140211/7800.html
隐患
通过 class-dump 可以导出代码的头文件,从而进行解析
http://blog.youkuaiyun.com/msyqmsyq/article/details/51363659
应对方案
- iOS 代码混淆
通过脚本对代码中的一些关键代码字符串进行加密处理,这样即使查看头文件,也会一头雾水。具体设计与实现:
http://blog.youkuaiyun.com/zm53373581/article/details/49053269 - 利用static关键字裁掉函数符号
如果函数属性为 static ,那么编译时该函数符号就会被解析为local符号。
在发布release程序时(用Xcode打包编译二进制)默认会strip裁掉这些函数符号
局限
当然这种方法也有局限性。正如你所知道的,static函数,只在本文件可见。
打破局限:
怎么让别的文件也能调到本文件的static方法呢? 在本文件建造一个结构体,结构体里包含函数指针。把static函数的函数指针都赋在这个结构体里,再把这个结构体抛出去。 - 关键代码函数写法。关键函数不要使用下面第一行的写法,第二行更好一些。
- (BOOL)isPasswordOk:(NSString*)password;
- (void)verifyPassword:(id)password;
第一行代码形式容易被 hook ,从而通过 method swizzling 直接更改代码的实现返回 yes
4. 将函数声明在结构体中,用函数指针成员的方式存储,这样编译后,只留了下地址,去掉了名字和参数表。
//.h 声明
#import
typedef struct _util {
BOOL (*isVerified)(void);
BOOL (*isNeedSomething)(void);
void (*resetPassword)(NSString *password);
}XXUtil_t ;
#define XXUtil ([_XXUtil sharedUtil])
@interface _XXUtil : NSObject
+ (XXUtil_t *)sharedUtil;
@end
//.m 文件
#import "XXUtil.h"
static BOOL _isVerified(void)
{
//bala bala ...
return YES;
}
static BOOL _isNeedSomething(void)
{
//bala bala ...
return YES;
}
static void _resetPassword(NSString *password)
{
//bala bala ...
}
static XXUtil_t * util = NULL;
@implementation _XXUtil
+(XXUtil_t *)sharedUtil
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
util = malloc(sizeof(XXUtil_t));
util->isVerified = _isVerified;
util->isNeedSomething = _isNeedSomething;
util->resetPassword = _resetPassword;
});
return util;
}
+ (void)destroy
{
util ? free(util): 0;
util = NULL;
}
@end
最后,根据Xcode的报错指引,把以前这样的调用
[XXUtil isVerified];
对应改成:
XXUtil->isVerified();
就可以了。
iOS 数据传输安全
隐患
http 与 https 协议,传输时都可能会被截获数据
1. http协议通过抓包可以获取
2. https协议通过 中间人攻击(Man-In-The-Middle Attack) 可以获取(Charles 通过安装 Mac 证书,且手机安装信任证书做到)。
3. 敏感信息明文传输,包括密码等
应对方案
- 密文传输敏感数据。
滴滴的登录做法(通过抓包解析出来的),采用 rsa 加密,用户登录时,首先请求 rsa 公钥,将密码加密后传输到服务器,服务器解密,然后加盐(salt),进行一定规则的加密,对比 - 改变数据传输格式
即使是密文传输也有风险,所以进行数据传输时,改变数据传输格式,前后端对字段名称进行一定的混淆,或者直接改变传输协议。
iOS 本地存储安全
隐患
数据库,Userdefaults , plist ,文件都有可能被破解出来。
应对方案
- 每个值进行存储前,都在前面加上一个随机字符串。
- 加密进行存储。