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”