如何保护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";
感谢您阅读本文,在此链接中找到源代码。