如何保护iOS中的大数据文件?

策略是保护大文件,将文件数据分成小块并以随机顺序合并,因此文件将被破坏。 将这些随机顺序保存在安全的环境中

使用相同的随机顺序将文件分成多个块,并按原始顺序排列它们,以将原始文件转换为原始格式。 源代码。


在第一个例子中

我们使用了简单的加密和解密,因为它消耗了将近100%的cpu和无效的内存量。

在第二个例子中

我们使用了加密和解密文件的方式,这在内存消耗和CPU方面都给人留下了深刻的印象。 结果可以在左侧调试导航器中看到。

源代码。在模拟器中运行项目构建,如您所见,有两个按钮,此POC应用程序沙箱中的大文件将尝试对其进行加密和解密。 当我们点击加密按钮时,此操作将把大文件拆分为数据部分,然后将这些数据部分混洗并合并为一个文件。 保存这些改组顺序以使用加密算法保存环境。 如果任何人发现此文件,则损坏的文件将无法读取。 要以原始格式返回,请点击解密按钮。 动作时将按顺序重排,然后再次将此损坏的文件划分为相同的数据块,并按原始顺序合并它们以恢复原始顺序。

让我们检查一下源代码,

–(IBAction)encryptFile:(UIButton *)sender {

NSUInteger偏移量= 0;

NSString * filepath = [[NSBundle mainBundle] pathForResource:LARGE_DATA_FILE ofType:LARGE_DATA_FILE_EXTENSION];

NSFileHandle * handle = [NSFileHandle fileHandleForReadingAtPath:filepath];

unsigned long long totolSize = [处理seekToEndOfFile];

NSUInteger chunkSize = 0;

chunkSize =(NSUInteger)totolSize / 10;

[handle seekToFileOffset:0];

NSData * data = [处理readDataOfLength:chunkSize];

/ *检查数据验证* /

BOOL isDataAvailable = totolSize> 0?是:否;

while(isDataAvailable)

{

@autoreleasepool {

/ *

偏移量:用于定义从何处开始读取数据。

ChunkSize:要从Offset读取多少数据。

* /

unsigned long long fileRange =偏移量+ chunkSize;

/ **检查数据验证* /

如果(fileRange <totolSize){

[处理seekToFileOffset:offset];

数据= [处理readDataOfLength:chunkSize];

偏移量+ = [数据长度];

[处理seekToFileOffset:offset];

}其他{

数据= [处理readDataToEndOfFile];

isDataAvailable = NO;

}

NSString * file = [自身文件位置:@(偏移量).stringValue和扩展:@“数据”];

/ **

从大数据文件中读取的部分数据,写入到名为的文件中

偏移量和扩展名“数据” * /

[data writeToFile:fileatomic:YES];

NSMutableDictionary * fileInfo = [NSMutableDictionary新];

[fileInfo setObject:[NSNumber numberWithUnsignedInteger:data.length] forKey:@“ size”]];

[fileInfo setObject:file forKey:@“ file”]];

[fileInfo setObject:[NSNumber numberWithUnsignedLongLong:offset] forKey:@“ offset”]];

/ **保存每个块数据信息,例如大小,偏移量和文件路径* /

[self.slicedDataFilesInfo addObject:fileInfo];

}

}

[处理closeFile];

[self mergeSpilittedFilesInShuffledOrder];

}

鉴于确实加载,我们启动了两个名为spilitted files info和shuffled files info的全局变量,稍后会告诉您。 正如您在加密操作中告诉您的那样,它将把一个大文件分割成多个块,然后将这些块洗牌,然后将它们再次合并为一个文件。 让我们看看它是如何发生的,为必须加密的文件提供路径。 要进一步移动,将检查数据可用性,然后使用offset和chunkSize变量计算文件范围。 偏移量是指从何处开始读取数据和块大小,要从偏移量读取多少数据。 我们已读取的块数据将在同一文件夹中写入一个单独的文件,重复相同的步骤,直到到达文件中的行尾。 保存每个块数据信息,例如大小,偏移量和保存文件的路径。现在,我们已将文件拆分到一个文件夹中,并将它们所需的信息(如偏移量和大小)存储在数组中。 接下来,我们将对数组进行混洗并将这些分散的文件合并到另一个文件中。 结果该文件已损坏。 如果有人能够找到它,则无法读取它,因为它已损坏。

要将损坏的文件转换为原始文件格式,需要使用与加密时相同的改组顺序。
这里将更正订单并合并它们,因此将其恢复为原始形式。

–(IBAction)fileDecrypt:(id)sender {

NSSortDescriptor *描述符= [[[NSSortDescriptor alloc] initWithKey:@“ offset” ascending:YES];

NSArray * sortedArray = [self.slicedDataFilesInfo sortedArrayUsingDescriptors:@ [descriptor]];

NSString * encryptedFileLocation = [自身文件位置:[NSString stringWithFormat:@”%@ _ encrypted_copy”,LARGE_DATA_FILE]和Ext:LARGE_DATA_FILE_EXTENSION];

NSFileHandle * readFileHandler = [NSFileHandle fileHandleForReadingAtPath:encryptedFileLocation];

NSString * newFileLocation = [自身文件位置:LARGE_DATA_FILE和扩展名:LARGE_DATA_FILE_EXTENSION];

NSFileHandle * writeFileHandler = [NSFileHandle fileHandleForWritingAtPath:newFileLocation];

[sortedArray enumerateObjectsUsingBlock:^(NSDictionary * dictionary,NSUInteger idx,BOOL * _Nonnull stop){

unsigned long longmodifiedOffset = [[dictionary objectForKey:@” modifiedOffset”] unsignedLongLongValue];

NSUInteger readDataLength = [[字典objectForKey:@“ size”] unsignedIntegerValue];

[readFileHandler seekToFileOffset:modifiedOffset];

NSData * data = [readFileHandler readDataOfLength:readDataLength];

[writeFileHandler writeData:data];

}];

[readFileHandler closeFile];

[writeFileHandler closeFile];

[self.slicedDataFilesInfo removeAllObjects];

}

用法

在Xcode中打开项目。 在项目导航器中选择“ FILES”文件夹,然后移动要加密和解密的任何大数据文件。 下一步将根据您放置在Files文件夹中的文件在ViewController.m中重命名常量文件名和文件扩展名。

NSString *const LARGE_DATA_FILE = @"YOUR_FILE_NAME"; 
NSString *const LARGE_DATA_FILE_EXTENSION = @"FILE_EXTENSION";

感谢您阅读本文,在此链接中找到源代码。