2014-03-01 68 views
9

我已經創建了示例hello world項目,然後將Data.plist文件添加到資源文件夾中。 現在人們可以通過解壓縮.ipa文件輕鬆獲取包文件。有什麼辦法保護保存在iPhone應用程序的應用程序包中的Data.plist文件?如何保護iOS套件文件,如plist,image,sqlite,媒體文件

Encryption is a decent method of scrambling the data but i don't know how to implement encription concept. 

你有任何示例代碼?

enter image description here

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Data" ofType:@"plist"]; 
    NSArray *arrData = [[NSArray alloc]initWithContentsOfFile:filePath]; 

    NSData *datas = [NSKeyedArchiver archivedDataWithRootObject:arrData]; 
    [datas writeToFile:filePath atomically:YES]; 

提取IPA文件之後

enter image description here

回答

-1

使用的NSKeyedArchiver從你的字典(的NSKeyedArchiver archivedDataWithRootObject :)創建一個NSData對象。然後使用AES加密NSData並將其寫入您的文件。

只讀相反的過程:首先讀取NSData,通過上述鏈接中的方法解密,然後將解密後的NSData傳遞給NSKeyedUnarchiver(NSKeyedUnarchiver unarchiveObjectWithData :),然後返回字典。您可以使用plist文件或NSDictionary保持數據安全。

Example 1

Example 2

編輯2:在mac上

NSDictionary *Your_NSDictionary = [NSDictionary dictionaryWithObjectsAndKeys: 
          @"Obj1", @"Key1", 
          @"Obj2", @"Key2", nil]; 
//store dictionary 
NSMutableData *yourData = [[NSMutableData alloc] init]; 
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; 
[archiver encodeObject:Your_NSDictionary forKey: @"key"]; 
[archiver finishEncoding]; 
[yourData writeToFile:@"FilePath" atomically:YES]; 

NSString* filePath = [[NSBundle mainBundle] pathForResource:@"Data" 
               ofType:@"plist"]; 
NSDictionary* data = [NSDictionary dictionaryWithContentsOfFile:filePath]; 
NSMutableDictionary * rootObject; 
rootObject = [NSMutableDictionary dictionary]; 
[rootObject setValue: data forKey:@"accounts"]; 
[NSKeyedArchiver archiveRootObject: rootObject toFile: path]; 
+0

這個作品..只是爲有機磷農藥中受益:要知道這需要內存和CPU時間) –

+0

你可以發佈樣本implementaion代碼? – Ravindhiran

+0

在部署前加密MAC上的文件。我創建一個Xcode示例。 –

9
  1. 加密文件...部署期間:

    第一:不要將要加密的文件添加到目標
    例如, Encryption-Test.plist

    然後添加一個shell腳本階段到您的xcode項目使用openssl來加密&複製文件。
    例如
    openssl enc -e -aes-256-cbc -pass pass:asdasd -in $PROJECT_DIR/test/Encryption-Test.plist -out $TARGET_BUILD_DIR/$UNLOCALIZED_RESOURCES_FOLDER_PATH/Encryption-Test.enc

  2. 從GitHub添加RNCryptor源文件到您的項目。這使得解密openSSL加密的AES文件非常容易。 (感謝來搶!)https://github.com/RNCryptor/RNCryptor (蘋果CCrypt API是不是很好用直接合作)

  3. 負荷數據和解密:

例如

@implementation TestViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    NSString *path = [[NSBundle mainBundle] pathForResource:@"Encryption-Test" ofType:@"enc"]; 
    NSData *passEncryptedData =[[NSData alloc] initWithContentsOfFile:path]; 
    NSString *pass = @"asdasd"; 

    NSData *dataDecrypted = [RNOpenSSLDecryptor decryptData:passEncryptedData withSettings:kRNCryptorAES256Settings password:pass error:nil]; 
    id plist = [NSPropertyListSerialization propertyListFromData:dataDecrypted mutabilityOption:NSPropertyListImmutable format:nil errorDescription:nil]; 

    assert(plist); 
    self.text.text = [plist description]; 
} 

@end 

加入全樣本:https://github.com/Daij-Djan/encryptBundleFiles

+0

以及沒有AFAICS。它只是一個圍繞蘋果C API的objC封裝 - C API吸收IMO和RNCryptor非常輕巧且易於使用 –

+0

因此您從Target!中刪除了Data.plist,修改了shell腳本中的輸入/輸出路徑,現在嘗試讀取Data.enc? –

+0

最後你的包中應該只有一個Data.enc –

2

我掙扎不出來上面的例子中,終於找到了一些代碼,讓你與解密的加密文件(實際上是任何文件) OpenSSL的。我在這個例子的文檔文件夾中工作,我沒有使用任何shell腳本。以下是如何做到這一點:

  1. 加密在的終端的文件,如下所示:
openssl aes-256-cbc -in questions.plist -out questions.enc
  • 文件(縣)添加到您的Xcode項目拖動到支持文件目錄
  • 下載RNCryptorhere
  • 查找下載的項目RNCryptor庫:encryptBundleFiles主/測試/ RNCryptor並將它們添加到您的Xcode項目
  • 導入RNDecryptor.hRNOpenSSLDecryptor.h文件到您的類文件,如ExampleViewController.m文件。
  • 從你想要調用的地方添加下面的代碼,就像某個函數一樣。

  • 你完成了。您現在可以使用plist文件來填充tableview。

  • // Copy the plist file from the resources folder to the documents folder 
        NSFileManager *fileManager = [NSFileManager defaultManager]; 
         NSError *error; 
         NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
         NSString *documentsDirectory = [paths objectAtIndex:0];

    NSString *txtPath = [documentsDirectory stringByAppendingPathComponent:@"questions.enc"]; if ([fileManager fileExistsAtPath:txtPath] == NO) { NSString *resourcePath = [[NSBundle mainBundle] pathForResource:@"questions" ofType:@"enc"]; [fileManager copyItemAtPath:resourcePath toPath:txtPath error:&error]; } NSString *filePath1 = [documentsDirectory stringByAppendingPathComponent:@"questions.encr"]; NSData *passEncryptedData =[[NSData alloc] initWithContentsOfFile:filePath1] ; NSString *pass = @"asdf"; // Insert your password from step 1 NSData *dataDecrypted = [RNOpenSSLDecryptor decryptData:passEncryptedData withSettings:kRNCryptorAES256Settings password:pass error:&error]; NSString *appFile = [documentsDirectory stringByAppendingPathComponent:@"questionsDECRYPTED.plist"]; //The Decrypted file saved here [dataDecrypted writeToFile:appFile atomically:YES];