En algunas ocasiones podemos tener la necesidad de encriptar bases de datos en Laravel, más aún con el RGPD. Si ese es tu caso, en este tutorial vamos a ver qué sencillo es conseguir este propósito gracias a Eloquent Mutators y Accessors. Definir un Trait para extender Eloquent Lo primero que vamos a hacer para conseguir un comportamiento más dinámico es crear un Trait para sobrescribir los métodos getAttribute y setAttribute de Eloquent, los cuáles nos permitirán alterar los datos de nuestro modelo al momento de obtener y establecer datos.
<?php
namespace App\Traits;
/**
* Trait Encryptable
* @package App\Traits
*/
trait Encryptable
{
/**
* @return mixed
*/
public function getSecretKey () {
return env('APP_DB_KEY');
}
/**
* @return mixed
*/
public function getKeyInitVector () {
return env('APP_KEY');
}
/**
* @return \Illuminate\Config\Repository|mixed
*/
public function getEncryptMethod () {
return config('app.cipher');
}
/**
* @param $string
* @return bool|string
*/
public function encrypt( $string ) {
$key = hash( config('app.encryption'), $this->getSecretKey() );
$iv = substr( hash( config('app.encryption'), $this->getKeyInitVector() ), 0, 16 );
return base64_encode( openssl_encrypt( $string, $this->getEncryptMethod(), $key, 0, $iv ) );
}
/**
* @param $string
* @return bool|string
*/
public function decrypt( $string ) {
$key = hash( config('app.encryption'), $this->getSecretKey() );
$iv = substr( hash( config('app.encryption'), $this->getKeyInitVector() ), 0, 16 );
return openssl_decrypt( base64_decode( $string ), $this->getEncryptMethod(), $key, 0, $iv );
}
/**
* @param $key
* @return bool|string
*/
public function getAttribute($key)
{
if (in_array($key, $this->encryptable)) {
$value = $this->decrypt($value);
return $value;
}
return parent::getAttribute($key);
}
/**
* @param $key
* @param $value
* @return mixed
*/
public function setAttribute($key, $value)
{
if (in_array($key, $this->encryptable)) {
$value = $this->encrypt($value);
}
return parent::setAttribute($key, $value);
}
}
Además de los métodos mencionados anteriormente, también tenemos 2 métodos importantes, el método encrypt y el método decrypt, es importante decir que este tipo de encriptación no es fiable si los datos que quieres manejar son sensibles, el motivo es que nosotros vamos a querer encriptar pero también desencriptar para mostrar estos datos posteriormente, incluso para iniciar sesión utilizando el correo electrónico, este último es el motivo real, para que fuese seguro la variable $iv debería ser dinámica y no estática. Aplicar el Trait Encryptable a nuestros modelos Ahora vamos a abrir por ejemplo el modelo User para utilizar el Trait Encryptable de la siguiente forma.
<?php
namespace App;
use App\Traits\Encryptable;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
/**
* App\User
*/
class User extends Authenticatable
{
use Notifiable, Encryptable;
/**
* @var array
*/
protected $encryptable = [
'name', 'email',
];
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name', 'email', 'password',
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];
}
Sólo por utilizar la propiedad $encryptable pasando las columnas que queramos encriptar en base de datos tenemos suficiente, si ahora por ejemplo registras un nuevo usuario verás que las columnas name y email son encriptadas en base de datos y si obtienes los usuarios verás que al acceder a dichas columnas éstas aparecen sin encriptar.
Curso Laravel 12
Completo 2026
El único curso 100% actualizado que incluye Laravel 12, Livewire 3, Vue 3, React 19 e Inertia 2. Aprende con proyectos reales y las últimas funcionalidades.
star Incluido en cualquier suscripción