2019-06-13iOS開發(fā)本地資源文件的加密方案

C 使用異或(xor)加密/解密文件

https://blog.csdn.net/fdipzone/article/details/20413631

一個(gè)iOS開發(fā)本地資源文件的加密方案

https://blog.csdn.net/qinqi376990311/article/details/81536052

我大概在網(wǎng)上搜了一下满着,有用 AES 加解密的赞庶,各種,甚至還編寫了簡(jiǎn)單的 MacApp 方便操作。如此當(dāng)然安全性是很高的沼死,同時(shí)也容易帶來性能問題阁吝。

我想到了一個(gè)很簡(jiǎn)單的辦法。其實(shí)就是利用 歸檔绷柒。

plist 要單獨(dú)處理志于,因?yàn)?plist 有可能是數(shù)組,也有可能是字典废睦。

其他文件可以統(tǒng)一按照二進(jìn)制文件處理伺绽。

打開Xcode,Command + Shift + N 創(chuàng)建一個(gè)新的 Command Line Tool 工程郊楣,用 Command Line Tool 就足夠啦憔恳。

在我們項(xiàng)目的工程中,把所有的需要加密的資源文件提取出來净蚤,并在工程中不要引用他們钥组。本例我放在 Resources 文件夾下

接下來在我們剛創(chuàng)建的 Command Line Tool 工程中,把文件夾拖進(jìn)來今瀑。注意:這里選擇 Create folder references?

導(dǎo)入之后程梦,看到的應(yīng)該是藍(lán)色的文件夾点把,就沒問題了?

#import <Foundation/Foundation.h>

NSString * OutputFilePath(NSString *fileName) {

? ? //加密之后的文件輸出路徑,這里我是輸出到桌面

? ? return [NSString stringWithFormat:@"/Users/#這里替換成你的用戶名#/Desktop/%@.data", fileName];

}

NSString * InputFilePath(NSString *fileName) {

? ? //資源文件路徑屿附,其實(shí)就是那個(gè) Resources 文件夾的路徑

? ? return [NSString stringWithFormat:@"/Users/#這里替換成你的用戶名#/Desktop/#這里是你主項(xiàng)目的名稱#/Resources/%@", fileName];

}

/**歸檔二進(jìn)制文件*/

void EncryptionDataFiles(NSArray *names) {

? ? [names enumerateObjectsUsingBlock:^(NSString * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {

? ? ? ? NSData *data = [NSData dataWithContentsOfFile:InputFilePath(obj)];

? ? ? ? [NSKeyedArchiver archiveRootObject:data toFile:OutputFilePath(obj)];

? ? }];

}

/**歸檔數(shù)組類型的Plist文件*/

void EncryptionArrayPlistFiles(NSArray *names) {

? ? [names enumerateObjectsUsingBlock:^(NSString * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {

? ? ? ? NSArray *array = [NSArray arrayWithContentsOfFile:InputFilePath(obj)];

? ? ? ? [NSKeyedArchiver archiveRootObject:array toFile:OutputFilePath(obj)];

? ? }];

}

/**歸檔字典類型的Plist文件*/

void EncryptionDictionaryPlistFiles(NSArray *names) {

? ? [names enumerateObjectsUsingBlock:^(NSString * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {

? ? ? ? NSDictionary *dic = [NSDictionary dictionaryWithContentsOfFile:InputFilePath(obj)];

? ? ? ? [NSKeyedArchiver archiveRootObject:dic toFile:OutputFilePath(obj)];

? ? }];

}

int main(int argc, const char * argv[]) {

? ? @autoreleasepool {

? ? ? ? // insert code here...

? ? ? ? NSArray *names = @[@"BankBin.plist"];

//? ? ? ? EncryptionDataFiles(names);

//? ? ? ? EncryptionArrayPlistFiles(names);

//? ? ? ? EncryptionDictionaryPlistFiles(names);

? ? }

? ? return 0;

}

編輯好之后郎逃,Command + R 就可以在輸出目錄上找到我們加密之后的文件了~

然后我們?cè)谥鞴こ讨械哪衬夸浵拢瑢?dǎo)入我們剛才輸出的文件挺份,所以這時(shí)候褒翰,加密之后的 data 文件,就會(huì)出現(xiàn)在 Copy Bundle Resources 里面了匀泊,也就是之后的 mainBundle 里面优训。

那么在主工程中要使用這些文件,需要解密各聘。這里我用了內(nèi)聯(lián)函數(shù)揣非,我寫在 PrefixHeader.pch 中

NS_INLINE id LocalFile(NSString *name) {

? ? //為什么用 id 類型呢,因?yàn)榉祷亟Y(jié)果有可能是 NSData 躲因,也可能是 NSArray早敬, 也可能是 NSDictionary 完全取決于當(dāng)初你加密之前是什么類型的。

? ? return [NSKeyedUnarchiver unarchiveObjectWithFile:[[NSBundle mainBundle] pathForResource:name ofType:nil]];

}

圖片資源的問題:

如果是有@2x 和 @3x 的區(qū)分大脉,那可能你在取出圖片的時(shí)候需要判斷[UIScreen mainScreen].scale 是 2 還是 3 搞监,從而取不同的 NSData

文件命名的問題:

我選擇 data 作為擴(kuò)展名,當(dāng)然也可以隨便輸入的箱靴。另外腺逛,導(dǎo)出的能是這樣的文件名:“BankBin.plist.data”,有兩個(gè)擴(kuò)展名衡怀,可以把.plist去掉棍矛,這樣看起來更規(guī)范一些。即 “BankBin.data”

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末抛杨,一起剝皮案震驚了整個(gè)濱河市够委,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌怖现,老刑警劉巖茁帽,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異屈嗤,居然都是意外死亡潘拨,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門饶号,熙熙樓的掌柜王于貴愁眉苦臉地迎上來铁追,“玉大人,你說我怎么就攤上這事茫船±攀” “怎么了扭屁?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)涩禀。 經(jīng)常有香客問我料滥,道長(zhǎng),這世上最難降的妖魔是什么艾船? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任葵腹,我火速辦了婚禮,結(jié)果婚禮上屿岂,老公的妹妹穿的比我還像新娘礁蔗。我一直安慰自己,他們只是感情好雁社,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著晒骇,像睡著了一般霉撵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上洪囤,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天徒坡,我揣著相機(jī)與錄音,去河邊找鬼瘤缩。 笑死喇完,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的剥啤。 我是一名探鬼主播锦溪,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼府怯!你這毒婦竟也來了刻诊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤牺丙,失蹤者是張志新(化名)和其女友劉穎则涯,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體冲簿,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡粟判,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了峦剔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片档礁。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖羊异,靈堂內(nèi)的尸體忽然破棺而出事秀,到底是詐尸還是另有隱情彤断,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布易迹,位于F島的核電站宰衙,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏睹欲。R本人自食惡果不足惜供炼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望窘疮。 院中可真熱鬧袋哼,春花似錦、人聲如沸闸衫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蔚出。三九已至弟翘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間骄酗,已是汗流浹背稀余。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留趋翻,地道東北人睛琳。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像踏烙,于是被迫代替她去往敵國(guó)和親师骗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,089評(píng)論 1 32
  • 接下來我們看base文件下的Foundation文件夾下文件 Base - Foundation 這個(gè)文件夾里面的...
    充滿活力的早晨閱讀 2,089評(píng)論 0 1
  • 1.自定義控件 a.繼承某個(gè)控件 b.重寫initWithFrame方法可以設(shè)置一些它的屬性 c.在layouts...
    圍繞的城閱讀 3,349評(píng)論 2 4
  • 前言 說是前言讨惩,其實(shí)也是本文誕生的目的丧凤。隨著公司業(yè)務(wù)的不斷增加,功能的快速迭代步脓,app的業(yè)務(wù)線越來越多愿待,代碼體積變...
    Yealink閱讀 5,276評(píng)論 0 13
  • 別人眼中的自己是一個(gè)高才生,家庭優(yōu)越靴患,工作好仍侥,而我眼中的自己是年齡大沒有合適的對(duì)象,家庭負(fù)擔(dān)重鸳君,工作中的不...
    啦啦啵啵閱讀 179評(píng)論 0 0