iOS动态部署之RSA加密传输Patch补丁
概要:這一篇博客主要說明下iOS客戶端動態(tài)部署方案中,patch(補(bǔ)丁)是如何比較安全的加載到客戶端中。
在整個過程中,需要使用RSA來加密(你可以選擇其它的非對稱加密算法),MD5來做校驗(同樣,你也可以選擇其他的算法)。
iOS客戶端中RSA加解密的例子不是很多,我在網(wǎng)絡(luò)上尋找了一些開源代碼,發(fā)現(xiàn)揭秘算法有誤。我就在其基礎(chǔ)上做了修改,修復(fù)了問題。并且我重新整理了一份,并且支持cocoapod接入,下面是github地址。以后我還會詳細(xì)的說明RSA加密的原理,以及github上代碼實現(xiàn)。
生成RSA公私鑰文件
RSA公私鑰聲稱可以參考下面的文章,照著一步步做就是了。其中,公私鑰長度建議1024位以上,我自己則采用了2048位的。
http://blog.csdn.net/yi_zz32/article/details/50097325使用.der后綴的公鑰和.p12為后綴的私鑰作為秘鑰對,對尚未加密的patcher進(jìn)行加密。
MD5校驗
因為網(wǎng)絡(luò)傳輸存在不穩(wěn)定性,倘若傳輸中某個字節(jié)出現(xiàn)了錯誤,那么加載patch后肯定會運行失敗,在這種情況下,我們是不能加載patcher的。游戲游戲在下載patch后,都會提示正在進(jìn)行MD5校驗(或其他算法校驗),都是這個道理。MD5的功能只是單純的進(jìn)行校驗。我直接把使用的代碼貼出來了,比較短。需要倒入庫#import <CommonCrypto/CommonDigest.h>,你可以直接拷貝。
+(NSString*)fileMD5:(NSString*)path {NSFileHandle *handle = [NSFileHandle fileHandleForReadingAtPath:path];if( handle== nil ) return @"ERROR GETTING FILE MD5"; // file didnt existCC_MD5_CTX md5;CC_MD5_Init(&md5);BOOL done = NO;while(!done){NSData* fileData = [handle readDataOfLength: 256 ];CC_MD5_Update(&md5, [fileData bytes], (uint32_t)[fileData length]);if( [fileData length] == 0 ) done = YES;}unsigned char digest[CC_MD5_DIGEST_LENGTH];CC_MD5_Final(digest, &md5);NSString* s = [NSString stringWithFormat: @"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",digest[0], digest[1],digest[2], digest[3],digest[4], digest[5],digest[6], digest[7],digest[8], digest[9],digest[10], digest[11],digest[12], digest[13],digest[14], digest[15]];return s; }生成加密后的Patcher
目前來說,我緊緊打算用patche做bug緊急修復(fù)的用途,沒有打算直接使用它發(fā)布新功能,所以patcher中緊緊包涵腳本的文本,不包含圖片等文件。
自己定義了流的生成與解析過程:
寫入md5值的長度,我這里用1個字節(jié)表示,已經(jīng)足夠的長度來表示了。
NSMutableData *finalData = [NSMutableData data];//所有的data最后都寫入這個data中NSString *fileMD5 = [MD5 fileMD5:dataFileName]; NSData *md5Data = [fileMD5 dataUsingEncoding:NSUTF8StringEncoding]; NSUInteger length = [md5Data length];unsigned char bit8 = length & 0x000000FF;//提取低八位 [finalData appendBytes:&bit8 length:1]; [finalData appendData:md5Data];最后在把RSA加密后的data拼接到finalData中,在把data輸出到文件。這樣patcher就搞定了。
解密patcher
patcher下載客戶端后,就需要對patcher進(jìn)行解析。解析就逆著patcher的生成過程就可以
NSData *decryptFileData = [NSData dataWithContentsOfFile:encryptFileName]; //獲取文件的data//讀取文件的第一個字節(jié), int8_t v1; [decryptFileData getBytes:&v1 range:NSMakeRange(0,1)]; //查看MD5值的長度 int getMG5Length = (int32_t)v1 & 0x0ff; //查看md5信息 NSData *getmd5Data = [decryptFileData subdataWithRange:NSMakeRange(1, getMG5Length)]; NSString *fileMD5s = [[NSString alloc] initWithData:getmd5Data encoding:NSUTF8StringEncoding]; //獲取真正的patcher文本的data NSData *contentData = [decryptFileData subdataWithRange:NSMakeRange(1+getMG5Length, decryptFileData.length - 1 -getMG5Length)];該有的信息全部存在了,只需要將data轉(zhuǎn)成文本,再次md5跟校驗值比較,是否一致,一致的話,那么這個patcher就是正常的,可以加載。如果不正常的話,那么根據(jù)app需求,可以重新下載等等處理。
轉(zhuǎn)載于:https://www.cnblogs.com/qianhongqiang/p/5310480.html
總結(jié)
以上是生活随笔為你收集整理的iOS动态部署之RSA加密传输Patch补丁的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【动态顺序表】 c语言的动态顺序表
- 下一篇: 第五章系统调用