AshFeistelCipher

View Source

AshFeistelCipher is an Ash.Resource extension for transforming integer attribute values using a Feistel cipher. This enables the generation of non-sequential, unpredictable values from sequential or otherwise predictable integer inputs.

Installation

mix igniter.install ash_feistel_cipher

Usage

Use AshFeistelCipher in your Ash.Resource and configure the feistel_cipher block as follows:

defmodule MyApp.Post do
  use Ash.Resource,
    data_layer: Ash.DataLayer.Postgres,
    extensions: [AshFeistelCipher]

  attributes do
    integer_primary_key :id

    # 'seq' is only a source for generating serial integers, so override with primary_key?: false.
    integer_primary_key :seq, primary_key?: false
  end

  feistel_cipher do
    encrypt do
      source :seq # Source attribute for the Feistel cipher.
      target :id # Target attribute for the Feistel cipher.
      bits 40 # Specifies the maximum number of bits for both the source and target integers.
      bits_confirm "0x28" # A confirmation value to prevent unintentional changes to the 'bits' setting.
    end

    encrypt do
      # You can define multiple 'encrypt' blocks if you need to configure
    end
  end
end

Then,

mix ash.codegen create_post

will generate a migration that sets up a database trigger to encrypt the seq attribute into the id attribute using a Feistel cipher.

See Also

  • feistel_cipher: Provides Ecto migrations for Feistel cipher. ash_feistel_cipher integrates this capability into the Ash framework for easy use with Ash resources.

License

MIT