我需要在Rails应用程序的内存中加密二进制文件(范围从几十kb到几mb)。出于合规性原因,我无法以未加密的形式将文件写入磁盘。我担心的是与这种方法相关的内存消耗。我想知道是否有任何方法可以做到这一点(也许有一种方法可以流式传输/数据块),与一次性操作整个文件相比,内存密集程度更低?
我更喜欢使用openssl aes-256-cbc密码,但我对其他算法(例如某种流密码)持开放态度,如果它相当安全并解决了我的内存问题。我已经在文件上使用aes-256-cbc加密了,所以我真的专注于内存方面,而不是如何实际加密。
加密大型二进制数据流有什么好的选择吗?
答案 0 :(得分:4)
我不明白为什么你担心Ruby提供的任何Cipher算法的内存消耗?
如果您使用Cipher#update
,那么您将收到可以写入输出流的大量加密数据。 AES块大小为16字节(128位,无论AES-128还是AES-256),因此对于每个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 :(得分:1)
只是因为用户上传了一个文件,你将在临时位置的磁盘上进行未加密,等待它被你的rails uploader复制到其他地方。