使用Carrierwave加密/解密

时间:2012-02-09 00:17:27

标签: ruby-on-rails-3 encryption file-upload configuration carrierwave

我想这样做,以便我的carrierwave上传器在存储文件时加密文件,然后在检索文件时对其进行解密。

我的第一个想法是重写CarrierWave :: Uploader :: Store :: store!和CarrierWave :: Uploader :: Store :: retrieve_from_store!方法,包括我的加密和解密代码,但我不太确定如何做到这一点?

我打算使用Blowfish加密。

存储

def store!(new_file=nil)
  # seems like I should process new_file here
  cache!(new_file) if new_file && ((@cache_id != parent_cache_id) || @cache_id.nil?)
  if @file and @cache_id
    with_callbacks(:store, new_file) do
      new_file = storage.store!(@file)
      @file.delete if (delete_tmp_file_after_storage && ! move_to_store)
      delete_cache_id
      @file = new_file
      @cache_id = nil
    end
  end
end

从商店检索

def retrieve_from_store!(identifier)
  with_callbacks(:retrieve_from_store, identifier) do
    res = storage.retrieve!(identifier)
    @file = res #process res before I store it to file?
  end
end

任何提示都将不胜感激。

1 个答案:

答案 0 :(得分:0)

你总是可以做这样的事情,文件实际上并没有存储在公共目录中。这样可以防止网络抓取工具或某人猜测文件名并下载您的文件

  def store_dir
    "/path_to_rails_app/uploads/#{model.user_id}/#{model.id}"
  end

从这里,您可以使用download方法和授权工具来查看用户是否有权下载。关于vunerabilities的任何想法?除了Mass Assignment或对机器的物理访问外,我认为这不是什么大问题。您还需要将cache_dir设置为公众之外的其他内容。

  def cache_dir
    "/path_to_rails_app/tmp/uploads/cache/#{model.user_id}/#{model.id}"
  end