Skip to content

Laravel 5.5 - data is stored as decrypted after model update #22

Open

Description

@bjauy

I have been testing this package for few days on Laravel 5.5. Recently, I've checked table content and some of the rows weren't encrypted at all.

After few tests in artisan tinker I've nailed the issue to updates that make the data unencrypted. Model creation works as expected.

The problem happens also in default L5.5 installation, using MySQL (MariaDB 10.1.26 exactly):

  1. Database and package setup:
composer create-project --prefer-dist laravel/laravel laravel55
cd laravel55
composer require delatbabel/elocryptfive
php artisan make:auth
php artisan migrate:fresh

(if there is an error with key length, change encoding values in config/database.php to 'utf8' and 'utf8_general_ci' accordingly)

  1. Add below to app/User.php:
use Delatbabel\Elocrypt\Elocrypt;

class User extends Authenticatable
{
    use Elocrypt;

   [...]

   protected $encrypts = [ 'name', ];

   [...]
  • add provider to ```config/app.php`
  1. Test in tinker:
>>> User::create(['name' => 'test', 'email' => 'test@example.com', 'password' => Hash::make('test')]);

The value for name is encrypted.

>>> User::find(1)->update(['email' => 'example@example.com']);

After the update table preview shows data as unecrypted.

Activity

  1. changed the title [-]Laravel 5.5 - data is stored as decrypted after update[/-] [+]Laravel 5.5 - data is stored as decrypted after model update[/+] on Sep 15, 2017
  2. dokicro commented on Sep 20, 2017

    @dokicro

    Hey, I have the same problem did you found any solutions?

  3. bjauy commented on Sep 21, 2017

    @bjauy
    Author

    Yes, you need to override getDirty() method in your models which depend on Elocrypt trait:

    public function getDirty()
    {
        $dirty = [];
    
        foreach ($this->attributes as $key => $value) {
            if (! $this->originalIsEquivalent($key, $value)) {
                        $dirty[$key] = $value;
            }
        }
    
        return $dirty;
    }
  4. dokicro commented on Sep 23, 2017

    @dokicro

    Thanks 👍

  5. delatbabel commented on Sep 25, 2017

    @delatbabel
    Owner

    Hrm, interesting. I wonder if it can be over-ridden in the trait and if doing so will cause breakages on prior versions of Laravel? I haven't started migrating any projects to L5.5 yet although it's a planned change with the new LTS release. I will keep this ticket open for monitoring and if anyone has any further information.

  6. bjauy commented on Sep 27, 2017

    @bjauy
    Author

    IIRC originalIsNumericallyEquivalent method was renamed (and refactored) to originalIsEquivalent in L5.5, so simply adding getDirty would break the trait for users of older versions.

    Maybe we could just add second, optional trait with just getDirty() overriden? This, and an information in the readme should be enough IMHO.

    Users of older Laravel versions wouldn't be affected by the changes.

    I can prepare pull request if you don't mind and if the change is ok for you.

  7. schonhose commented on Oct 16, 2017

    @schonhose

    I just want to chime in that I am also looking to migrate from Laravel 5.1 to 5.5. I use this package to encrypt data in my database so I welcome any ideas on how to make it work on 5.5.

  8. mrgrain commented on Nov 3, 2017

    @mrgrain

    There is also an other bug with Laravel 5.5: If an attribute is casted, the getDirty will fail as well in certain cases. Essentially Laravel is casting the encrypted values which will result in different encrypted values being regarded as the same. E.g. object, array or json will be tried to be read from JSON. However, since the provided input is encrypted, the casted value evaluates to false no matter what.

    Our solution is to overwrite the castAttribute method

        /**
         * Decrypt encrypted data before it is processed by cast attribute
         * @param $key
         * @param $value
         *
         * @return mixed
         */
        protected function castAttribute($key, $value)
        {
            return parent::castAttribute($key, $this->doDecryptAttribute($key, $value));
        }
  9. delatbabel commented on Nov 10, 2017

    @delatbabel
    Owner

    Thanks for the information. I'm continuing to track this. I'm about to migrate one project from 5.1 LTS to 5.5 LTS so I will try to build something that works for both LTS versions.

  10. mrgrain commented on Dec 3, 2017

    @mrgrain

    Instead of trying to fix it for both versions at the same time (or forks or whatever), @delatbabel you could just release a new version which requires Laravel 5.5

  11. mbardelmeijer commented on Dec 5, 2017

    @mbardelmeijer

    @delatbabel any update on this?

  12. austinheap commented on Dec 14, 2017

    @austinheap

    I ended up 1) forking this, 2) fixing all the Laravel 5.5 issues, 3) dropping support for Laravel below 5.5, and 4) a bunch of random cleanup & unit tests. Available below:

  13. ITwrx commented on Feb 20, 2018

    @ITwrx

    @mrgrain where should one override the castAttribute method?
    thanks

  14. mrgrain commented on Feb 21, 2018

    @mrgrain

    @ITwrx Overwrite it in the model that needs to be encrypted. We have a base model for all encrypted models which uses Elocrypt's trait and overrides the castAttribute method (amongst other things).

    Or you could simply create your own EncryptedModel trait which extends the original Elocrypt one.

  15. ITwrx commented on Feb 21, 2018

    @ITwrx

    @mrgrain cool, thanks.

  16. delatbabel commented on Feb 21, 2018

    @delatbabel
    Owner

    Hi all, firstly sorry about the delay. I have had a long period of illness, just getting back to health now. I'll certainly look at integrating the patches into a Laravel 5.5 branch shortly.

  17. ITwrx commented on Feb 21, 2018

    @ITwrx

    glad you're back. stay well.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions