首页 > 解决方案 > 使用 Lockbox 和 CarrierWave 为 Ruby on Rails 加密和解密文件上传

问题描述

我正在尝试使用Lockbox来加密和解密文件上传,但文档假定我不知道我缺乏知识,并且维护 repo 的人似乎太忙而无法提供任何帮助。有人可以帮我理解这一点吗?

文档说主密钥用于创建存储在模型上的密码。它说这个密码的模式字段应该是textorbinary并且命名为 likeattribute_ciphertext而不是 plain attribute。结果,我的模型如下所示:

class IdentityDocument < ApplicationRecord
 belongs_to :user, foreign_key: :user_id
 validates :document_front_ciphertext, :document_back_ciphertext, presence: true
 mount_uploader :document_front_ciphertext, IdentityDocumentsUploader
 mount_uploader :document_back_ciphertext, IdentityDocumentsUploader
end

根据 CarrierWave 的部分,加密就像encrypt在我的上传器中添加一个一样简单:

class IdentityDocumentsUploader < CarrierWave::Uploader::Base
 encrypt
end

控制器创建模型:

    def create
     @id_doc = current_user.identity_documents.new(id_doc_params)
    end

    def id_doc_params
     params.require(:identity_document).permit(:document_front_ciphertext, :document_back_ciphertext)
    end

视图将参数提交给控制器:

<%= form_for @id_doc do |f| %>
 <%= f.label :document_front_ciphertext, "Front of driver's license or other state ID" %>
 <%= f.file_field :document_front_ciphertext %>
 <%= f.label :document_back_ciphertext, "Back of driver's license or other state ID" %>
 <%= f.file_field :document_back_ciphertext %>
 <%= f.submit "Upload", data: { disable: true } %>
<% end %>

这个 SQL 输出看起来是未加密的(我猜这是有意的?也许文件上传不需要加密的数据库字段,我不需要_ciphertext在我的模式中?):

INSERT INTO "identity_documents" ("user_id", "document_front_ciphertext", "document_back_ciphertext") VALUES ($1, $2, $3) RETURNING "id"  [["user_id", 1], ["document_front_ciphertext", "california-drivers-license.jpg"], ["document_back_ciphertext", "2016-11-25-license-4.jpg"]]

在我的控制台中查询这个模型看起来像这样:

id = IdentityDocument.find 4
#<IdentityDocument id: 4, user_id: 1, document_front_ciphertext: "california-drivers-license.jpg", document_back_ciphertext: "2016-11-25-license-4.jpg">
id.document_front_ciphertext
#<IdentityDocumentsUploader:0x00007fec0cfad980 @model=#<IdentityDocument id: 4, user_id: 1, document_front_ciphertext: "california-drivers-license.jpg", document_back_ciphertext: "2016-11-25-license-4.jpg">, @mounted_as=:document_front_ciphertext, @file=#<CarrierWave::SanitizedFile:0x00007fec0cfad098 @file="/Users/me/code/site/public/uploads/identity_document/document_front_ciphertext/4/california-drivers-license.jpg", @original_filename=nil, @content_type=nil, @content=nil>, @filename=nil, @cache_id=nil, @versions={}, @format=nil, @storage=#<CarrierWave::Storage::File:0x00007fec0cfad7c8 @uploader=#<IdentityDocumentsUploader:0x00007fec0cfad980 ...>, @cache_called=nil>>

出于某种原因,此 Uploader 包含整个模型,但只有第一个图像可通过@file或获得@mounted_as

这让我开始解密并将图像显示给管理员。文档说在我的控制器中做这样的事情:

def id_document
 send_data user.identity_document.document_front_ciphertext.read, type: user.identity_document.document_front_ciphertext.content_type
end

...但是,这会导致Errno::ENAMETOOLONG错误。如果我在 ' 的第一个参数的末尾更改read为,我的视图会充满......我认为什么是加密文件?它看起来像这样:pathsend_data

/Users/me/code/project/public/uploads/identity_document/document_front_ciphertext/1/OWkN7fKEetY2vBWXxkAdWFr96aKOF7Abt8Q7E5cNWvK7zALMwUoH63ZpvYnvYQ7mLqbf32Imqdt+85WpyLjPKf+xmEjHIJ3U7PQNviMDJsBl+OHQRLsfurqNMY2IJXYvmoZLuFN0MykG7BEj9+aKodN0qxlQIHfMQEPBzdQ2G5iss46l7qlyImXt/BH64LYbDxxUqTfCB8B6N7UEZTWy7o8v2ggchQVtleQtxeYsSQoknPlXwa5eEe604c+CHWBXMjisF4LwP+cGcL+j8oIEg+vqwZo3Firxh367b+wzutBWGPNEzNVVtvSKEPToxu9aFjJrBPLwR3LTl8bLqap88i2MqkmtUtAT5UL4514OdqGh5dBduGnpAFOTMVCW4lBPZ7XGltjwCbZ+nLdCAQcT/xgCNRZ8qNpPzTOMsUbNJktwiM5J2J7YfX/H0lhG0CBxFxoGc0FoXs1+Jx82pCHJAdoemk4HNTXIRR3F0qgoVAi16F2wz2ofCJ0DQZT9h5witwxg3XpMYitUw/UnGCoCQpzxV60scnaCRb05wavDRR/97XQvFpBWxIFOjt0MJEzMCpTpCa51KT94a9Q9dL+P04MSQNQ7XVDRvqdsp1LYXKmoxAeBhdZQeOTjBvyLyDvI+TBkqQl/WwsgaabeFDw0O8ovo46yVl0OjjHQZOYmFgRz8VHX0iF6xfiqPRXnZlTB/BbhbRocnEGXav1DpwhLeEFtm/2OigZglBNtbI7B2t6EsEq87/eFHMRjbfUHGAovxfBlc3ZFXS9IlGFmhr5NdhBbEW/oaXc0ZpvR7tTx6H+yyvv6HFAa0tSwV6JThCc3OlvMGpykhQ3R58J5E1BYe/NJrKM3VlvTBptQEP4+RFDct83sthbCYwhlclAeAPDLPjbop6CaA35iV+9skkb1cpGlj3NLx7hY66ZloVDiE8JhCLD/sQTcvZ0zQ3/r7VFeXydiQZpu4QTA9v0Q+Cq5X+qMe1g5cc3cpfP90LfqfIag8Z+Scl18cNteqArl0Ex/lqQktLVINfZW5J+jvXZTV2Al9F5XW14NGlznXe9R4TT4XnlOzHDodThboLtMngWlIf3v/aywevcOE1TtqmxdwGu5wbsaffzKdZGDaxTWuiapMRn4IJUp7zYxUOSAipL7x++Ski+su5bgbUw/Gn2KFomCYRwwvEH1wVKl6BDajL29K6LEFF/jLHEdvwVhj22G0II747xkKtybHStSRrx+3vV...

那么....我究竟如何显示这些图像?我走在正确的道路上;)但我很困惑。

标签: ruby-on-railsencryptioncarrierwave

解决方案


推荐阅读