Sha256: 4fb61c50ab53a83ae106c86f5d53df574ce2eabc91fea0b80d2c0036592b2473

Contents?: true

Size: 1.94 KB

Versions: 42

Compression:

Stored size: 1.94 KB

Contents

# frozen_string_literal: true

require "securerandom"

module ActiveRecord
  module Encryption
    # Utility for generating and deriving random keys.
    class KeyGenerator
      attr_reader :hash_digest_class

      def initialize(hash_digest_class: ActiveRecord::Encryption.config.hash_digest_class)
        @hash_digest_class = hash_digest_class
      end

      # Returns a random key. The key will have a size in bytes of +:length+ (configured +Cipher+'s length by default)
      def generate_random_key(length: key_length)
        SecureRandom.random_bytes(length)
      end

      # Returns a random key in hexadecimal format. The key will have a size in bytes of +:length+ (configured +Cipher+'s
      # length by default)
      #
      # Hexadecimal format is handy for representing keys as printable text. To maximize the space of characters used, it is
      # good practice including not printable characters. Hexadecimal format ensures that generated keys are representable with
      # plain text
      #
      # To convert back to the original string with the desired length:
      #
      #   [ value ].pack("H*")
      def generate_random_hex_key(length: key_length)
        generate_random_key(length: length).unpack("H*")[0]
      end

      # Derives a key from the given password. The key will have a size in bytes of +:length+ (configured +Cipher+'s length
      # by default)
      #
      # The generated key will be salted with the value of +ActiveRecord::Encryption.key_derivation_salt+
      def derive_key_from(password, length: key_length)
        ActiveSupport::KeyGenerator.new(password, hash_digest_class: hash_digest_class)
          .generate_key(key_derivation_salt, length)
      end

      private
        def key_derivation_salt
          @key_derivation_salt ||= ActiveRecord::Encryption.config.key_derivation_salt
        end

        def key_length
          @key_length ||= ActiveRecord::Encryption.cipher.key_length
        end
    end
  end
end

Version data entries

42 entries across 42 versions & 5 rubygems

Version Path
activerecord-8.0.2 lib/active_record/encryption/key_generator.rb
minato_ruby_api_client-0.2.2 vendor/bundle/ruby/3.2.0/gems/activerecord-7.1.3.4/lib/active_record/encryption/key_generator.rb
activerecord-8.0.1 lib/active_record/encryption/key_generator.rb
activerecord-8.0.0.1 lib/active_record/encryption/key_generator.rb
activerecord-7.2.2.1 lib/active_record/encryption/key_generator.rb
activerecord-7.1.5.1 lib/active_record/encryption/key_generator.rb
activerecord-8.0.0 lib/active_record/encryption/key_generator.rb
activerecord-7.2.2 lib/active_record/encryption/key_generator.rb
activerecord-7.1.5 lib/active_record/encryption/key_generator.rb
activerecord-8.0.0.rc2 lib/active_record/encryption/key_generator.rb
activerecord-7.2.1.2 lib/active_record/encryption/key_generator.rb
activerecord-7.1.4.2 lib/active_record/encryption/key_generator.rb
activerecord-8.0.0.rc1 lib/active_record/encryption/key_generator.rb
activerecord-7.2.1.1 lib/active_record/encryption/key_generator.rb
activerecord-7.1.4.1 lib/active_record/encryption/key_generator.rb
activerecord-8.0.0.beta1 lib/active_record/encryption/key_generator.rb
omg-activerecord-8.0.0.alpha9 lib/active_record/encryption/key_generator.rb
omg-activerecord-8.0.0.alpha8 lib/active_record/encryption/key_generator.rb
omg-activerecord-8.0.0.alpha7 lib/active_record/encryption/key_generator.rb
omg-activerecord-8.0.0.alpha4 lib/active_record/encryption/key_generator.rb