【问题标题】:Ruby GPGME - How to encrypt large filesRuby GPGME - 如何加密大文件
【发布时间】:2016-01-21 14:35:28
【问题描述】:

在 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")

在这种情况下,我收到了内存分配错误: “读取:分配内存失败(NoMemoryError)”

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

【问题讨论】:

    标签: ruby encryption gpgme


    【解决方案1】:

    最明显的问题是您使用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 在幕后所做的事情,但来自我的文档和来源偷看它似乎是一个精心打造的宝石,所以我猜这会成功。

    【讨论】:

    • 我只使用 gpgme,我就是这样做的,所以它应该可以工作(尽管我使用 File.open 的块形式)
    • 亲爱的反对者:请留下评论,解释您反对的原因。如果缺少我的答案,我将不胜感激有机会改进它。
    • 刚刚针对我的目的进行了测试,它就像一个魅力,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-18
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    相关资源
    最近更新 更多