2011-07-19 19 views
1

Railsアプリケーションのメモリにバイナリファイル(数十キロバイトから数キロバイト)を暗号化する必要があります。コンプライアンス上の理由から、ファイルを暗号化されていない形式でディスクに書き込むことはできません。私の懸念は、このアプローチに関連するメモリ消費量です。私は一度にファイル全体を操作しようとするよりもメモリーを消費しないように、これを行う方法(おそらくデータをストリーム/チャンクできる方法がある)のための推奨事項があるかどうか疑問に思っています。Railsアプリケーションでバイナリファイルを暗号化する最もメモリ効率の良い方法は?

私はopenssl aes-256-cbc暗号を使用することをお勧めしますが、それは合理的に安全でメモリの問題を解決する他のアルゴリズム(たとえば、何らかの種類のストリーミング暗号)に開放されています。私は既にファイル上でaes-256-cbcを使用して暗号化作業を行っているので、実際に暗号化を行う方法ではなく、メモリ面に集中しています。

大きなバイナリデータストリームを暗号化するための適切なオプションはありますか?

+0

また、ちょうどのために明快さ - ファイルはユーザーによってアップロードされています。しかし、Amazon S3からロードされたストアド・ファイルも解読する必要があるので、理想的なソリューションがどちらの場合でも有効です。 –

+1

以前に暗号化されたファイルシステムを使用しようとしましたか? – Anatoly

+0

暗号化されたファイルシステムだけでは、コンプライアンスの要件を満たしません。なぜなら、サーバーを侵害すると、fsのデータが自動的に破損するからです(何か不足している場合を除きます)。理想的には、暗号化ソリューションは、鍵ストアと暗号化されたデータの両方を独立して満たす必要があります。 –

答えて

4

Rubyで提供されている暗号アルゴリズムのメモリ消費が心配されている理由はありませんか?

Cipher#updateを使用すると、出力ストリームに書き込むことができる暗号化されたデータのチャンクが送信されます。 AESブロックのサイズは16バイト(AES-128またはAES-256に関係なく128ビット)なので、16バイトごとに16バイトの暗号化出力が生成されます。これはあなたの入力をバッファリングし、ワンショットの操作ですべてを暗号化する必要がないことを意味し、あなたが入力のチャンクを読んで、あなたの出力に書き込む前にCipher#updateを使用して暗号化することができます。

# assuming io is the IO representing your uploaded file 
# and out is the IO you are writing to 
while chunk = io.read(1024) 
    out << cipher.update(chunk) 
end 
out << cipher.final 
1

ユーザーがファイルをアップロードしたのは、一時的な場所にあるディスクに暗号化されていないファイルを、あなたのレールアップローダが別の場所にコピーするのを待っているからです。

+0

これは、Railsのtmpディレクトリをメモリベースのファイルシステムとしてマウントすることで回避できますか? S3から暗号化されたバージョンを取り出して解読すると、一時的な場所にファイルが作成されるとは思わなかったので、解読する側を解決する必要がありますか? –

+0

誰かがあなたのfsへのアクセス権を持っていますか?あなたはレールアプリにOWASPのセキュリティルールを読むことができます – Anatoly

+0

誰もアクセス権がありません。私は、OWASPのルールを見て、感謝します。 –

関連する問題