我的任务是提高文档共享应用的安全性。服务器上的文件需要加密,当应用程序下载文件时,如果解密确实与例如文件下载同时发生,则是理想的。 didReceiveData
。有些客户的视频文件系统限制在500 MB以下。
由于内置支持恢复下载(setAllowResumeForFileDownloads
),现在使用旧ASIHTTPRequest下载文件。
我发现这个精彩的框架RNCryptor支持异步解密。以下是使用纯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
)代码来同时下载和解密大文件?
正如@warrenm指出NSMutableData上的RNCryptor
类别应该有助于内存使用。我无法弄清楚这是否是罪魁祸首。
我找到了罪魁祸首。我正在准备我的测试项目,让其他人可以运行。我确实将下载URL从快速服务器更改为Dropbox,突然之间内存使用率下降了。这意味着应用程序的下载速度比解密数据的速度快,从而构建缓冲区。我从不认为这是一个问题。感谢@warrenm领导。
https://dl.dropbox.com/u/195602/stackoverflow/OnlineDecryptTest.zip
切换kUseFastServer
中的常量kUseEncryption
和ViewController.m
以查看不同的内存使用情况。
解决方案是使用NSInputStream
/ NSOutputStream
进行下载和解密两步流程或做一些魔术。我会推荐后者,但我无法弄清楚如何做到这一点。