класс ActiveSupport::MessageEncryptor
MessageEncryptor — простой способ шифрования значений, которые хранятся в ненадежном месте.
Шифртекст и вектор инициализации кодируются в base64 и возвращаются вам.
Это можно использовать в ситуациях, аналогичных MessageVerifier, но когда вы не хотите, чтобы пользователи могли определить значение полезной нагрузки.
salt = SecureRandom.random_bytes(64)
key = ActiveSupport::KeyGenerator.new('password').generate_key(salt) # => "\x89\xE0\x156\xAC..."
crypt = ActiveSupport::MessageEncryptor.new(key) # => #<ActiveSupport::MessageEncryptor ...>
encrypted_data = crypt.encrypt_and_sign('my secret data') # => "NlFBTTMwOUV5UlA1QlNEN2xkY2d6eThYWWh..."
crypt.decrypt_and_verify(encrypted_data) # => "my secret data"
Константы
- OpenSSLCipherError
Открытые методы класса
Инициализировать новый MessageEncryptor. secret должен быть не короче размера ключа шифра. Для стандартного шифра 'aes-256-cbc' это 256 бит. Если вы используете секрет, введённый пользователем, вы можете сгенерировать подходящий ключ с помощью OpenSSL::Digest::SHA256.new(user_secret).digest или аналогичной функции.
Параметры:
-
:cipher— Шифр для использования. Может быть любым шифром, возвращаемымOpenSSL::Cipher.ciphers. По умолчанию — 'aes-256-cbc'. -
:serializer— Сериализатор объекта Объект для использования. По умолчанию —Marshal.
# File activesupport/lib/active_support/message_encryptor.rb, line 44 def initialize(secret, *signature_key_or_options) options = signature_key_or_options.extract_options! sign_secret = signature_key_or_options.first @secret = secret @sign_secret = sign_secret @cipher = options[:cipher] || 'aes-256-cbc' @verifier = MessageVerifier.new(@sign_secret || @secret, :serializer => NullSerializer) @serializer = options[:serializer] || Marshal end
Открытые методы экземпляра
Дешифровать и проверить сообщение. Нам нужно проверить сообщение, чтобы избежать атак с использованием заполнения. Ссылка: www.limited-entropy.com/padding-oracle-attacks.
# File activesupport/lib/active_support/message_encryptor.rb, line 62 def decrypt_and_verify(value) _decrypt(verifier.verify(value)) end
Зашифровать и подписать сообщение. Нам нужно подписать сообщение, чтобы избежать атак с использованием заполнения. Ссылка: www.limited-entropy.com/padding-oracle-attacks.
# File activesupport/lib/active_support/message_encryptor.rb, line 56 def encrypt_and_sign(value) verifier.generate(_encrypt(value)) end
© 2004–2016 David Heinemeier Hansson
Licensed under the MIT License.