Ruby GPGME - 如何加密大文件



我在Ruby中使用GPGME加密大文件(大于可用内存)时遇到了困难。

#!/usr/bin/ruby
require 'gpgme'
def gpgfile(localfile)
  crypto = GPGME::Crypto.new
  filebasename = File.basename(localfile)
  filecripted = crypto.encrypt File.read(localfile), :recipients => "info@address.com", :always_trust => true
  File.open("#{localfile}.gpg", 'w') { |file| file.write(filecripted) }
end
gpgpfile("/home/largefile.data")

在这种情况下,我遇到了内存分配错误:"读取:无法分配内存(无内存错误)"

有人可以解释我如何逐块读取源文件(例如 100Mb)并通过加密写入它们?

最明显的问题是您使用 File.read(localfile) 将整个文件读入内存。Crypto#encrypt 方法将 IO 对象作为其输入,因此您可以向其传递 File 对象,而不是 File.read(localfile)(将文件的内容作为字符串返回)。同样,您可以将 IO 对象作为:output选项,让您将输出直接写入文件而不是内存:

def gpgfile(localfile)
  infile = File.open(localfile, 'r')
  outfile = File.open("#{localfile}.gpg", 'w')
  crypto = GPGME::Crypto.new    
  crypto.encrypt(infile, recipients: "info@address.com",
                         output: outfile,
                         always_trust: true)
ensure
  infile.close
  outfile.close
end

我从未使用过 ruby-gpgme,所以我不能 100% 确定这会解决您的问题,因为它有点取决于 ruby-gpgme 在幕后的作用,但从文档和来源来看,我偷看它似乎是一个理智构建的宝石,所以我猜这会解决问题。

最新更新