Spec-Zone.ru › Ruby on Rails 8.1

class ActiveRecord::Encryption::Encryptor

Родитель:
Object

Шифратор предоставляет API шифрования, который ActiveRecord::Encryption::EncryptedAttributeType использует для шифрования и расшифровки значений атрибутов.

Он взаимодействует с KeyProvider для получения ключей и делегирует выполнение алгоритма шифрования объекту ActiveRecord::Encryption::Cipher.

Константы

DECRYPT_ERRORS
ENCODING_ERRORS
THRESHOLD_TO_JUSTIFY_COMPRESSION

Это пороговое значение нельзя изменить.

Пользователи могут искать атрибуты, зашифрованные с параметром ‘deterministic: true`. Это возможно, потому что мы можем детерминированно сгенерировать сообщение для заданного открытого текста и выполнить обычный поиск строки в SQL.

Проблема в том, что в сообщениях может присутствовать или отсутствовать заголовок “c” — в зависимости от того, применялось ли сжатие при шифровании. Если изменить это пороговое значение, сообщение, генерируемое для поиска, может отличаться для одного и того же открытого текста, и поиск по существующим данным может завершиться неудачей.

Атрибуты

compressor [R]

Компрессор, используемый для сжатия полезной нагрузки.

Открытые методы класса

new (compress: true, compressor: nil) Показать исходный код
# 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.

Открытые методы экземпляра

binary? () Показать исходный код
# File activerecord/lib/active_record/encryption/encryptor.rb, line 86
def binary?
  serializer.binary?
end
decrypt (encrypted_text, key_provider: default_key_provider, cipher_options: {}) Показать исходный код
# 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 и возвращает результат в виде обычного текста.

Параметры

:key_provider

Поставщик Key, используемый для операции шифрования. Если он не указан, по умолчанию используется ActiveRecord::Encryption.key_provider.

:cipher_options

Параметры, относящиеся к шифру; они будут переданы объекту Cipher, настроенному в ActiveRecord::Encryption.cipher.

encrypt (clear_text, key_provider: default_key_provider, cipher_options: {}) Показать исходный код
# 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 и возвращает результат шифрования.

Внутри выполняются следующие действия:

  1. Создаётся новый объект ActiveRecord::Encryption::Message.

  2. Выполняется сжатие и шифрование clean_text в качестве полезной нагрузки сообщения.

  3. Выполняется сериализация с помощью ActiveRecord::Encryption.message_serializer (по умолчанию — ActiveRecord::Encryption::SafeMarshal).

  4. Результат кодируется с помощью Base64.

Параметры

:key_provider

Поставщик Key, используемый для операции шифрования. Если он не указан, по умолчанию используется ActiveRecord::Encryption.key_provider.

:cipher_options

Параметры, относящиеся к шифру; они будут переданы объекту Cipher, настроенному в ActiveRecord::Encryption.cipher.

encrypted? (text) Показать исходный код
# 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.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API