Module: Familia::Features::EncryptedFields::ModelClassMethods

Defined in:
lib/familia/features/encrypted_fields.rb

Instance Method Summary collapse

Instance Method Details

#encrypted_field(name, aad_fields: []) ⇒ Object

Define an encrypted field that transparently encrypts/decrypts values

Encrypted fields are stored as JSON objects containing the encrypted ciphertext along with cryptographic metadata. Values are automatically encrypted on assignment and decrypted on access.

Examples:

Basic encrypted field

class Vault < Familia::Horreum
  feature :encrypted_fields
  encrypted_field :secret_key
end

Encrypted field with additional authentication

class Document < Familia::Horreum
  feature :encrypted_fields
  field :doc_id, :owner_id
  encrypted_field :content, aad_fields: [:doc_id, :owner_id]
end

Parameters:

  • name (Symbol)

    Field name

  • aad_fields (Array<Symbol>) (defaults to: [])

    Additional fields to include in authentication

  • kwargs (Hash)

    Additional field options



298
299
300
301
302
303
304
305
306
307
308
309
# File 'lib/familia/features/encrypted_fields.rb', line 298

def encrypted_field(name, aad_fields: [], **)
  @encrypted_fields ||= []
  @encrypted_fields << name unless @encrypted_fields.include?(name)

  # Add to field_groups if the group exists
  if field_groups&.key?(:encrypted_fields)
    field_groups[:encrypted_fields] << name
  end

  field_type = EncryptedFieldType.new(name, aad_fields: aad_fields, **)
  register_field_type(field_type)
end

#encrypted_field?(field_name) ⇒ Boolean

Check if a field is encrypted

Parameters:

  • field_name (Symbol)

    The field name to check

Returns:

  • (Boolean)

    true if field is encrypted, false otherwise



324
325
326
# File 'lib/familia/features/encrypted_fields.rb', line 324

def encrypted_field?(field_name)
  encrypted_fields.include?(field_name.to_sym)
end

#encrypted_fieldsArray<Symbol>

Returns list of encrypted field names defined on this class

Returns:

  • (Array<Symbol>)

    Array of encrypted field names



315
316
317
# File 'lib/familia/features/encrypted_fields.rb', line 315

def encrypted_fields
  @encrypted_fields || []
end

#encryption_infoHash

Get encryption algorithm information

Returns:

  • (Hash)

    Hash containing encryption algorithm details



332
333
334
335
336
337
338
339
340
# File 'lib/familia/features/encrypted_fields.rb', line 332

def encryption_info
  provider = Familia::Encryption.current_provider
  {
    algorithm: provider.algorithm_name,
    key_size: provider.key_size,
    nonce_size: provider.nonce_size,
    tag_size: provider.tag_size,
  }
end