lib/helpers.ex

defmodule Fields.Helpers do
  @moduledoc """
  Helper functions for hashing, 
  generating (random) salt values
  and fetching secrets form environment.
  """

  @doc """
  Hash a string, or a value that implements the String.Chars protocol, using
  Argon2. Argon2 is a strong but slow hashing function, so is recommended
  for passwords.
  """
  @spec hash(atom(), String.Chars.t()) :: String.t()
  def hash(:argon2, value) do
    Argon2.Base.hash_password(to_string(value), Argon2.Base.gen_salt(), [{:argon2_type, 2}])
  end

  @spec hash(atom(), String.Chars.t()) :: String.t()
  def hash(:sha256, value) do
    :crypto.hash(:sha256, to_string(value) <> get_salt(to_string(value)))
  end

  defp get_salt(value) do
    :crypto.hash(:sha256, value <> fetch_secret_key_base())
  end

  defp fetch_secret_key_base do
    Application.fetch_env!(:fields, :secret_key_base)
  end
end