我的任务是提高文档共享应用程序的安全性。服务器上的文件需要加密,当应用程序下载文件时,如果解密确实与例如文件下载同时发生,那将是可取的。didReceiveData
. 一些客户的视频文件略低于 500 MB 的系统限制。
现在文件是用旧的ASIHTTPRequest下载的,因为它内置了对恢复下载的支持 ( setAllowResumeForFileDownloads
)。
我发现了这个出色的框架RNCryptor,它支持异步解密。这是使用 pure 的示例NSURLConnection
:
- (void)connection:(NSURLConnection *)connection didReceiveResponse (NSURLResponse*)response {
self.decryptor = [[RNOpenSSLDecryptor alloc] initWithSettings:kRNCryptorAES256Settings password:password handler:^(RNCryptor *cryptor, NSData *data) {
[self writeData:data];
if (cryptor.isFinished){
[self finishAndPlayVideo];
}
}];
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
[self.decryptor addData:data];
}
问题是RNCryptor
它NSMutableData *inData
附加了所有数据,但这会产生巨大的内存问题。数据需要像RNOpenSSLCryptor.m的旧版本 1.1 一样流过流。
有没有人有解决方案来操纵RNCryptor
,ASIHTTPRequest
(或AFNetworking
)代码来同时下载和解密大文件?
更新1:
正如@warrenm 指出的那样, NSMutableDataRNCryptor
上的类别应该有助于内存使用。我不知道这是否是罪魁祸首。
更新 2:
我找到了罪魁祸首。我正在准备我的测试项目以使其适合其他人运行。我确实将下载网址从快速的企业服务器更改为保管箱,突然间内存使用量下降了。这意味着应用程序的下载速度比它解密数据的速度要快,从而建立了一个缓冲区。我从不认为这是一个问题。感谢@warrenm 引领潮流。
测试项目
https://dl.dropbox.com/u/195602/stackoverflow/OnlineDecryptTest.zip
切换常量kUseFastServer
并查看不同kUseEncryption
的ViewController.m
内存使用情况。
解决方案
解决方案是使下载和解密 2 步过程或使用NSInputStream
/做一些魔术NSOutputStream
。我更喜欢后者,但我不知道该怎么做。