PHPackages                             jdforsythe/elocryptlumen - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Database &amp; ORM](/categories/database)
4. /
5. jdforsythe/elocryptlumen

ActiveLibrary[Database &amp; ORM](/categories/database)

jdforsythe/elocryptlumen
========================

Automatically encrypt and decrypt Eloquent attributes with ease.

1.0.2(9y ago)11.6kMITPHPPHP &gt;=5.4.0

Since Apr 13Pushed 9y ago1 watchersCompare

[ Source](https://github.com/jdforsythe/elocryptlumen)[ Packagist](https://packagist.org/packages/jdforsythe/elocryptlumen)[ RSS](/packages/jdforsythe-elocryptlumen/feed)WikiDiscussions master Synced today

READMEChangelog (1)Dependencies (6)Versions (4)Used By (0)

Eloquent Encryption/Decryption for Lumen 5
==========================================

[](#eloquent-encryptiondecryption-for-lumen-5)

[![Build Status](https://camo.githubusercontent.com/af1419fe329f51e9a5c06d17b4ec1700d02cad1f19ccfd646453aeb8fec90def/68747470733a2f2f7472617669732d63692e6f72672f6a64666f7273797468652f656c6f63727970746c756d656e2e7376673f6272616e63683d6d6173746572)](https://travis-ci.org/jdforsythe/elocryptlumen.svg?branch=master)

Automatically encrypt and decrypt Lumen 5 Eloquent values.

READ THIS FIRST
---------------

[](#read-this-first)

Encrypted values are usually longer than plain text values. Sometimes much longer. You may find that the column widths in your database tables need to be extended to store the encrypted values.

If you are encrypting long strings such as JSON blobs then the encrypted values may be longer than a VARCHAR field can support, and you may need to extend your column types to TEXT or LONGTEXT.

What Does This Do?
------------------

[](#what-does-this-do)

This encrypts and decrypts columns stored in database tables in Lumen applications transparently, by encrypting data as it is stored in the model attributes and decrypting data as it is recalled from the model attributes.

All data that is encrypted is prefixed with a tag (currently `__ELOCRYPT__;`) so that encrypted data can be easily identified.

This supports columns that store either encrypted or non-encrypted data to make migration easier. Data can be read from columns correctly regardless of whether it is encrypted or not but will be automatically encrypted when it is saved back into those columns.

Contributors
------------

[](#contributors)

This is Del's Laravel 5 Elocrypt package ported so it can be used in Lumen without enabling facades. I have made the following changes:

- Load the `'encrypter'` directly instead of through the `Crypt` facade, enabling use in Lumen without turning on Facades
- Enable setting the elocrypt prefix in the `.env` file (`ELOCRYPT_PREFIX=`)

The original Laravel 5 package is here:

The original Laravel 4 package is here:

Installation
------------

[](#installation)

This package can be installed via Composer by adding the following to your `composer.json` file:

```
    "require": {
        "jdforsythe/elocryptlumen": "~1.0"
    }

```

You must then run the following command:

```
    composer update

```

Usage
-----

[](#usage)

Simply reference the Elocrypt trait in any Eloquent Model you wish to apply encryption to and define an `$encrypts` array containing a list of the attributes to encrypt.

For example:

```
    use Jdforsythe\ElocryptLumen\Elocrypt;

    class User extends Eloquent {

        use Elocrypt;

        /**
         * The attributes that should be encrypted on save.
         *
         * @var array
         */
        protected $encrypts = [
            'address_line_1', 'first_name', 'last_name', 'postcode'
        ];
    }
```

You can combine `$casts` and `$encrypts` to store encrypted arrays. An array will first be converted to JSON and then encrypted.

For example:

```
    use Jdforsythe\ElocryptLumen\Elocrypt;

    class User extends Eloquent {

        use Elocrypt;

        protected $casts = ['extended_data' => 'array'];

        protected $encrypts = ['extended_data'];
    }
```

How it Works?
=============

[](#how-it-works)

By including the Elocrypt trait, the setAttribute() and getAttributeFromArray() methods provided by Eloquent are overridden to include an additional step. This additional step simply checks whether the attribute being set or get is included in the `$encrypts` array on the model, and either encrypts/decrypts it accordingly.

Summary of Methods in Illuminate\\Database\\Eloquent\\Model
-----------------------------------------------------------

[](#summary-of-methods-in-illuminatedatabaseeloquentmodel)

This surveys the major methods in the Eloquent Model class as of Laravel v 5.1.12 and checks to see how those models set attributes and hence how they are affected by this trait.

- constructor -- calls fill()
- fill() -- calls setAttribute() which has been extended to encrypt the data.
- hydrate() -- TBD
- create() -- calls constructor and hence fill()
- firstOrCreate -- calls constructor
- firstOrNew -- calls constructor
- updateOrCreate -- calls fill()
- update() -- calls fill()
- toArray() -- calls attributesToArray()
- jsonSerialize() -- calls toArray()
- toJson() -- calls toArray()
- attributesToArray() -- calls getArrayableAttributes().
- getAttribute -- calls getAttributeValue()
- getAttributeValue -- calls getAttributeFromArray()
- getAttributeFromArray -- calls getArrayableAttributes()
- getArrayableAttributes -- has been extended here to decrypt the data.
- setAttribute -- has been extended here to encrypt the data.
- getAttributes -- has been extended here to decrypt the data.

Keys and IVs
------------

[](#keys-and-ivs)

The key for the Lumen Encrypter service is set in the `.env` file as `APP_KEY`. Lumen defaults to AES-256-CBC cipher.

The IV for encryption is randomly generated.

FAQ
===

[](#faq)

Manually Encrypting Data
------------------------

[](#manually-encrypting-data)

You can manually encrypt or decrypt data using the `encryptedAttribute()` and `decryptedAttribute()` functions. An example is as follows:

```
    $user = new User();
    $encryptedEmail = $user->encryptedAttribute(Input::get("email"));
```

Encryption and Searching
------------------------

[](#encryption-and-searching)

You will not be able to search on encrypted data, because it is encrypted. Comparing encrypted values would require a fixed IV which introduces security issues.

If you need to search on data then either:

- Leave it unencrypted, or
- Hash the data and search on the hash instead of the encrypted value. Use a well known hash algorithm such as SHA256.

You could store both a hashed and an encrypted value, use the hashed value for searching and retrieve the encrypted value for other uses.

Encryption and Authentication
-----------------------------

[](#encryption-and-authentication)

The same problem with searching applies for authentication because authentication requires a user search.

If you have an authentication table where you encrypt the user data including the login data (for example the email), this will prevent Auth::attempt from working. For example this code will not work:

```
    $auth = Auth::attempt(array(
                "email"     =>  Input::get("email"),
                "password"  =>  Input::get("password"),
    ), $remember);
```

As for searching, comparing the encrypted email will not work, because it would require a fixed IV which introduces security issues.

What you will need to do instead is to hash the email address using a well known hash function (e.g. SHA256 or RIPE-MD160) rather than encrypt it, and then in the Auth::attempt function you can compare the hashes.

If you need access to the email address then you could store both a hashed and an encrypted email address, use the hashed value for authentication and retrieve the encrypted value for other uses (e.g. sending emails).

###  Health Score

29

—

LowBetter than 62% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity17

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity60

Established project with proven stability

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~8 days

Total

3

Last Release

3616d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/6c225adb433ed114d4ec4e10db5d42389bfe555738a46a92dd7374a1b20d5470?d=identicon)[jdforsythe](/maintainers/jdforsythe)

---

Top Contributors

[![jdforsythe](https://avatars.githubusercontent.com/u/286972?v=4)](https://github.com/jdforsythe "jdforsythe (4 commits)")

---

Tags

cryptodecrypt-dataeloquentencrypted-dataencrypted-valueslumenlumen-packagephpencryptionlumeneloquentencrypteloquent encryptioneloquent aeselocryptlumen encryptionlumen aes

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/jdforsythe-elocryptlumen/health.svg)

```
[![Health](https://phpackages.com/badges/jdforsythe-elocryptlumen/health.svg)](https://phpackages.com/packages/jdforsythe-elocryptlumen)
```

###  Alternatives

[delatbabel/elocryptfive

Automatically encrypt and decrypt Eloquent attributes with ease.

8492.9k](/packages/delatbabel-elocryptfive)[dolphiq/laravel-aescrypt

AES encrypt and decrypt Eloquent attributes inspired by elocryptfive

171.7k](/packages/dolphiq-laravel-aescrypt)[betterapp/laravel-db-encrypter

Provides database model attribute encryption/decryption

365604.2k8](/packages/betterapp-laravel-db-encrypter)[mohammad-fouladgar/eloquent-builder

527183.5k](/packages/mohammad-fouladgar-eloquent-builder)[esensi/model

The base model traits of Esensi

20166.5k1](/packages/esensi-model)[veelasky/laravel-hashid

HashId Implementation on Laravel Eloquent ORM

45161.0k3](/packages/veelasky-laravel-hashid)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
