iOS 應(yīng)用安全性

1,通過(guò)對(duì)CodeResources讀取資源文件原始hash,和當(dāng)前hash進(jìn)行對(duì)比,判斷是否經(jīng)過(guò)篡改,被篡改過(guò)的文件應(yīng)從服務(wù)器重新請(qǐng)求資源文件進(jìn)行替換,或者引導(dǎo)用戶從正規(guī)渠道重新下載app。CodeResources文件是一個(gè)屬性列表,包含bundle中所有其他文件的列表。這個(gè)屬性列表可能有多個(gè)files,這是一個(gè)字典,其中鍵是文件名,值通常是Base64格式的散列值。如果鍵表示的文件是可選的,那么值本身也是一個(gè)字典,這個(gè)字典有一個(gè)hash鍵和一個(gè)optional鍵,如果文件被修改,其對(duì)應(yīng)的hash也會(huì)改變。所以CodeResources文件內(nèi)的hash可以用于判斷一個(gè)應(yīng)用程序是否完好無(wú)損。
2,可以通過(guò)檢測(cè)cryptid的值來(lái)檢測(cè)是否被篡改,篡改過(guò)cryptid的值為0。
3,
如果以上都滿足不了的話,可以自己對(duì)需要保護(hù)的重要文件做MD5hash校驗(yàn)。使用這個(gè)框架FileMD5Hash生成hash。通過(guò)對(duì)比原始文件的hash和當(dāng)前的hash來(lái)做判斷。只要文件的內(nèi)容有被改變,hash的值一定會(huì)變,目前的破解技術(shù)都會(huì)修改到系統(tǒng)文件、比如CodeResources、Info.plist。

舉個(gè)例子,給bundle里面所有的文件生成hash。
1.讀取bundle所有文件名

//獲得所有資源文件名
-(NSArray *)allFilesAtPath:(NSString *)dir{
    NSMutableArray * arr = [NSMutableArray array];
    NSFileManager * manager = [NSFileManager defaultManager];
    NSArray *temp = [manager contentsOfDirectoryAtPath:dir error:nil];
    
    for (NSString * fileName in temp) {
        BOOL flag = YES;
        NSString * fullpath = [dir stringByAppendingPathComponent:fileName];
        if ([manager fileExistsAtPath:fullpath isDirectory:&flag]) {
            if (!flag ) {
                [arr addObject:fileName];
//                NSLog(@"%@",fileName);
            }
        }
    }
    return arr;
}

//生成資源文件名及對(duì)應(yīng)的hash的字典, eg:@{@"appicon":@"wegdfser45t643232324234"};
-(NSDictionary *)getBundleFileHash{
    NSMutableDictionary * dicHash = [NSMutableDictionary dictionary];
    NSArray * fileArr = [self allFilesAtPath:[[NSBundle mainBundle]resourcePath]];
    for (NSString * fileName in fileArr) {
        //對(duì)應(yīng)的文件生成hash
        NSString * HashString = [FileMD5Hash computeMD5HashOfFileInPath:[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:fileName]];
        if (HashString != nil) {
            [dicHash setObject:HashString forKey:fileName];
        }
    }
 //所有資源文件的hash就保存在這數(shù)組里
  return dicHash;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一切都要從越獄說(shuō)起 為什么要越獄?在ios8之前,輸入法和鍵盤(pán)一直是蘋(píng)果的“自留地”,從iPhone一代問(wèn)世ios...
    rang0閱讀 23,672評(píng)論 28 44
  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 30,187評(píng)論 8 265
  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,695評(píng)論 0 5
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,619評(píng)論 1 32
  • 雨夜微醉入睡,早晨六點(diǎn)多便被窗外嘰嘰喳喳的鳥(niǎo)叫聲吵醒,于是心里像飛進(jìn)了一只鳥(niǎo),不得安寧,轉(zhuǎn)輾反側(cè)難以再眠,索...
    絲美天下閱讀 439評(píng)論 0 2

友情鏈接更多精彩內(nèi)容