class ActiveRecord::Encryption::Encryptor
Шифратор предоставляет API шифрования, который ActiveRecord::Encryption::EncryptedAttributeType использует для шифрования и расшифровки значений атрибутов.
Он взаимодействует с KeyProvider для получения ключей и делегирует выполнение алгоритма шифрования объекту ActiveRecord::Encryption::Cipher.
Константы
- DECRYPT_ERRORS
- ENCODING_ERRORS
- THRESHOLD_TO_JUSTIFY_COMPRESSION
-
Это пороговое значение нельзя изменить.
Пользователи могут искать атрибуты, зашифрованные с параметром ‘deterministic: true`. Это возможно, потому что мы можем детерминированно сгенерировать сообщение для заданного открытого текста и выполнить обычный поиск строки в SQL.
Проблема в том, что в сообщениях может присутствовать или отсутствовать заголовок “c” — в зависимости от того, применялось ли сжатие при шифровании. Если изменить это пороговое значение, сообщение, генерируемое для поиска, может отличаться для одного и того же открытого текста, и поиск по существующим данным может завершиться неудачей.
Атрибуты
Компрессор, используемый для сжатия полезной нагрузки.
Открытые методы класса
# File activerecord/lib/active_record/encryption/encryptor.rb, line 27 def initialize(compress: true, compressor: nil) @compress = compress @compressor = compressor || ActiveRecord::Encryption.config.compressor end
Параметры
:compress-
Логическое значение, указывающее, следует ли сжимать записи перед шифрованием. По умолчанию —
true. :compressor-
Используемый компрессор. Он должен поддерживать
deflateиinflate. Если значение не указано, по умолчанию используетсяActiveRecord::Encryption.config.compressor, для которого, в свою очередь, по умолчанию заданоZlib.
Открытые методы экземпляра
# File activerecord/lib/active_record/encryption/encryptor.rb, line 86 def binary? serializer.binary? end
# File activerecord/lib/active_record/encryption/encryptor.rb, line 69
def decrypt(encrypted_text, key_provider: default_key_provider, cipher_options: {})
message = deserialize_message(encrypted_text)
keys = key_provider.decryption_keys(message)
raise Errors::Decryption unless keys.present?
uncompress_if_needed(cipher.decrypt(message, key: keys.collect(&:secret), **cipher_options), message.headers.compressed)
rescue *(ENCODING_ERRORS + DECRYPT_ERRORS)
raise Errors::Decryption
end Расшифровывает encrypted_text и возвращает результат в виде обычного текста.
Параметры
# File activerecord/lib/active_record/encryption/encryptor.rb, line 51
def encrypt(clear_text, key_provider: default_key_provider, cipher_options: {})
clear_text = force_encoding_if_needed(clear_text) if cipher_options[:deterministic]
validate_payload_type(clear_text)
serialize_message build_encrypted_message(clear_text, key_provider: key_provider, cipher_options: cipher_options)
end Шифрует clean_text и возвращает результат шифрования.
Внутри выполняются следующие действия:
-
Создаётся новый объект
ActiveRecord::Encryption::Message. -
Выполняется сжатие и шифрование
clean_textв качестве полезной нагрузки сообщения. -
Выполняется сериализация с помощью
ActiveRecord::Encryption.message_serializer(по умолчанию —ActiveRecord::Encryption::SafeMarshal). -
Результат кодируется с помощью Base64.
Параметры
# File activerecord/lib/active_record/encryption/encryptor.rb, line 79 def encrypted?(text) deserialize_message(text) true rescue Errors::Encoding, *DECRYPT_ERRORS false end
Возвращает значение, указывающее, зашифрован ли текст.
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.