1.判断是否设置了代理(防止抓包)
#在网络请求前插入这个方法,再根据需求做相应的防范
+ (BOOL)getDelegateStatus
{
NSDictionary *proxySettings = CFBridgingRelease((__bridge CFTypeRef _Nullable)((__bridge NSDictionary *)CFNetworkCopySystemProxySettings()));
NSArray *proxies = CFBridgingRelease((__bridge CFTypeRef _Nullable)((__bridge NSArray *)CFNetworkCopyProxiesForURL((__bridge CFURLRef)[NSURL URLWithString:@"http://www.google.com"], (__bridge CFDictionaryRef)proxySettings)));
NSDictionary *settings = [proxies objectAtIndex:0];
NSLog(@"host=%@", [settings objectForKey:(NSString *)kCFProxyHostNameKey]);
NSLog(@"port=%@", [settings objectForKey:(NSString *)kCFProxyPortNumberKey]);
NSLog(@"type=%@", [settings objectForKey:(NSString *)kCFProxyTypeKey]);
if ([[settings objectForKey:(NSString *)kCFProxyTypeKey] isEqualToString:@"kCFProxyTypeNone"])
{
//没有设置代理
return NO;
} else {
//设置代理了
return YES;
}
}
2.数据库(sqlite)整库加密:
可使用第三方的SQLite扩展库,对数据库进行整体的加密。如:SQLCipher,git地址
- 本地简单数据储存使用 SSKeychain
//存储
[SSKeychain setPassword: data[@"mobile"] forService:@"ProjectName"account:@"mobile"];
//读取
NSString * phoneNumber = [SSKeychain passwordForService:@"ProjectName"account:@"mobile"];
4.检查设备是否越狱
+ (BOOL)isJailbroken {
// 检查是否存在越狱常用文件
NSArray *jailFilePaths = @[@"/Applications/Cydia.app",
@"/Library/MobileSubstrate/MobileSubstrate.dylib",
@"/bin/bash",
@"/usr/sbin/sshd",
@"/etc/apt"];
for (NSString *filePath in jailFilePaths) {
if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
return YES;
}
}
// 检查是否安装了越狱工具Cydia
if([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"cydia://package/com.example.package"]]){
return YES;
}
// 检查是否有权限读取系统应用列表
if ([[NSFileManager defaultManager] fileExistsAtPath:@"/User/Applications/"]){
NSArray *applist = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:@"/User/Applications/"
error:nil];
NSLog(@"applist = %@",applist);
return YES;
}
// 检测当前程序运行的环境变量
char *env = getenv("DYLD_INSERT_LIBRARIES");
if (env != NULL) {
return YES;
}
return NO;
}
6.应用进入后台时的截屏行为
当应用进入后台时,系统会自动在当前应用的页面截屏并存储到手机内,如果当前页面涉及敏感信息时,被攻击会造成泄密。
一般我们在应用被挂起时,在当前页面添加一层高斯模糊,在应用重新进入前台时,删除模糊效果
7.防止二次打包
1)有些hacker可能会通过篡改你的程序包(包括资源文件和二进制代码)加入一些广告或则修改你程序的逻辑,然后重新签名打包,
2)通过检测SignerIdentity判断是Mach-O文件否被篡改
原理是:SignerIdentity的值在info.plist中是不存在的,开发者不会加上去,苹果也不会,只是当ipa包被反编译后篡改文件再次打包,需要伪造SignerIdentity。判断是否被二次打包,如果程序被篡改,则退出程序。
+ (BOOL)isSecondIPA{
NSBundle *bundle = [NSBundle mainBundle];
NSDictionary *info = [bundle infoDictionary];
if ([info objectForKey: @"SignerIdentity"] != nil){
//存在这个key,则说明被二次打包了
return YES;
}
return NO;
}