README.md

# EctoCrypto

`EctoCrypto` provides `Ecto` types and utilities for saving data in encrypted
or hashed formats.

The goal is to provide easy to use, sane, and secure cryptographic
functionality that can be dropped directly into `Ecto` schemas.

Further documentation at https://hexdocs.pm/ecto_crypto/getting-started.html.

## Installation

The package can be installed by adding `ecto_crypto` to your list of
dependencies in `mix.exs`:


```elixir
def deps do
  [
    {:ecto_crypto, "~> 0.1.0"}
  ]
end
```

## How does it work?

The following assumes that you have a database table generated with the following migration:

```elixir
defmodule Repo.Migrations.CreateTestSchema do
  use Ecto.Migration

  def change do
    create table(:test_schema) do
      add :encrypted_string, :binary
    end
  end
end
```

To create an ecto schema with a field that automatically encrypted at the field
level upon being inserted to the database, use the
`EctoCrypto.EctoTypes.EncryptedBinary` `Ecto` type in the schema.

```elixir
defmodule TestSchema do
  use Ecto.Schema
  import Ecto.Changeset

  schema "test_schema" do
    field(:encrypted_string, EctoCrypto.EctoTypes.EncryptedBinary)
  end

  @fields ~w(encrypted_string)a

  def changeset(attrs) do
    changeset(%TestSchema{}, attrs)
  end

  def changeset(%TestSchema{} = schema, attrs) do
    cast(schema, attrs, @fields)
  end
end
```

When interacting with this schema in elixir, the field should behave like a
regular string or binary field. At the database level, the field will be
encrypted.

The inspiration for this project comes from the excellent tutorial at
https://github.com/dwyl/phoenix-ecto-encryption-example.