ドキュメント共有アプリのセキュリティを向上させるタスクがあります。サーバー上のファイルは暗号化する必要があり、アプリがファイルをダウンロードするときに、ファイルのダウンロードと同時に復号化が行われることが望ましいでしょう。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:
犯人を見つけました。他の人が実行できるように、テストプロジェクトを準備していました。ダウンロード URL を高速な企業サーバーからドロップボックスに変更したところ、突然メモリ使用量が減少しました。これは、アプリがデータを復号化するよりも速くダウンロードしているため、バッファが構築されていることを意味します。私はこれを問題として考えたことはありません。先導してくれた@warrenmに感謝します。
テスト プロジェクト
https://dl.dropbox.com/u/195602/stackoverflow/OnlineDecryptTest.zip
定数kUseFastServer
を切り替えて、さまざまなメモリ使用例を確認しますkUseEncryption
。ViewController.m
解決
解決策は、ダウンロードと復号化を 2 段階のプロセスにするか、NSInputStream
/を使って魔法をかけることNSOutputStream
です。私は後者を好むでしょうが、それを行う方法がわかりません。