Шифрование и дешифрование загрузки файлов с помощью Lockbox и CarrierWave для Ruby on Rails - PullRequest
6 голосов
/ 01 октября 2019

Я пытаюсь использовать Lockbox для шифрования и дешифрования закачек файлов, но документация предполагает, что я не знаю, чего мне не хватает, и человек, который ведет репо, кажется слишком занят, чтобы оказать какую-либо помощь. Может ли кто-нибудь помочь мне понять это?

В документации сказано, что главный ключ используется для создания шифра, который хранится в модели. Он говорит, что поля схемы для этого шифра должны быть text или binary и именоваться как attribute_ciphertext, а не просто 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/mkeable/code/fractionclub/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 на path в конце первого аргумента send_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...

Итак ... как именно я отображаю эти изображения? Я на правильном пути;) но я очень растерялся.

...