Skip to content

Instantly share code, notes, and snippets.

@eldair
Forked from themsaid/AppServiceProvider.php
Created September 16, 2020 11:13
Show Gist options
  • Save eldair/744809f9099c33e4334de7642a52045b to your computer and use it in GitHub Desktop.
Save eldair/744809f9099c33e4334de7642a52045b to your computer and use it in GitHub Desktop.
Re-encryption after APP_KEY rotation
<?php
namespace App\Providers;
use App\Encrypter;
use Illuminate\Support\Str;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*
* @return void
*/
public function register()
{
$this->app->singleton('encrypter', function($app){
$config = $app->make('config')->get('app');
if (Str::startsWith($key = $config['key'], 'base64:')) {
$key = base64_decode(substr($key, 7));
}
return new Encrypter($key, $config['cipher']);
});
}
}
<?php
namespace App;
use Illuminate\Support\Str;
class Encrypter extends \Illuminate\Encryption\Encrypter
{
/**
* Decrypt the given value.
*
* @param string $payload
* @param bool $unserialize
* @return mixed
*
* @throws \Illuminate\Contracts\Encryption\DecryptException
*/
public function decrypt($payload, $unserialize = true)
{
try{
return parent::decrypt($payload, $unserialize);
}catch(\Throwable $e){
$currentKey = $this->key;
$this->key = Str::startsWith(config('app.old_key'), 'base64:')
? base64_decode(substr(config('app.old_key'), 7))
: config('app.old_key');
return tap(parent::decrypt($payload, $unserialize), function () use ($currentKey) {
$this->key = $currentKey;
});
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment