gildonei / laravel-encrypt
Database field encryption and encrypted-field queries for Laravel Eloquent
Requires
- php: ^8.2
- illuminate/database: ^12.0 || ^13.0
- illuminate/support: ^12.0 || ^13.0
Requires (Dev)
- orchestra/testbench: ^10.0 || ^11.0
- phpunit/phpunit: ^11.0 || ^12.0
Suggests
None
Provides
None
Conflicts
None
Replaces
None
This package is auto-updated.
Last update: 2026-10-08 19:05:29 UTC
README
Pacote Composer experimental para consultas Eloquent sobre campos criptografados no próprio banco, inspirado no CakeAes.
Estado: estrutura do pacote, perfis de banco e helpers de consulta estão implementados. A gravação e leitura automáticas no ciclo de vida dos models, as operações em lote e os testes de integração em servidores reais ainda estão pendentes. Não use em produção.
Requisitos
- PHP 8.2 ou superior.
- Laravel/Illuminate Database 12 ou 13; o Laravel 13 requer PHP 8.3.
- MySQL/MariaDB ou PostgreSQL com
pgcryptohabilitada.
Instalação durante o desenvolvimento
Em desenvolvimento local, configure um repositório path e instale o pacote:
{
"repositories": [
{ "type": "path", "url": "/var/www/laravel-encrypt", "options": { "symlink": true } }
]
}
composer require gildonei/laravel-encrypt:dev-main php artisan vendor:publish --tag=laravel-encrypt-config
O pacote ainda não foi publicado no Packagist.
Configure segredos diferentes fora do código versionado. Para criptografia de texto, use colunas BLOB/VARBINARY no MySQL ou bytea no PostgreSQL.
Uso atualmente implementado
Um model opta pelos campos e pode selecionar um perfil específico por campo:
use Gildonei\LaravelEncrypt\Concerns\HasEncryptedFields; use Illuminate\Database\Eloquent\Model; class Citizen extends Model { use HasEncryptedFields; public function encryptedFields(): array { return ['name', 'phone']; } public function encryptedFieldProfiles(): array { return ['phone' => 'postgres-raw']; } }
Os helpers implementados geram SQL para filtrar, ordenar ou selecionar texto descriptografado:
$citizens = Citizen::query() ->whereEncryptedLike('name', '%Santos%') ->whereEncryptedIn('phone', ['11999999999', '11888888888']) ->orderByEncrypted('name') ->get(); $names = Citizen::query()->selectEncrypted('name', 'display_name')->get();
Também existem whereEncrypted, orWhereEncrypted, whereEncryptedNotIn, encryptValue e decryptValue. Valores e chaves são passados em bindings. Identificadores, operadores e direções são validados.
Esses helpers não tornam create(), save(), refresh() ou acesso a propriedades transparentes. As colunas precisam conter ciphertext compatível antes de uma consulta protegida. SQL livre e DB::table() não recebem criptografia automática.
Configuração e formatos
Publique config/laravel-encrypt.php e defina as variáveis de ambiente para chaves. O arquivo inclui:
- MySQL legado
AES_ENCRYPT/AES_DECRYPT, com chave hexadecimal e modo de sessão validado quando o helper manual executa. - MySQL
aes-256-ecb, com chave de 64 caracteres hexadecimais. - MariaDB no formato legado AES-128-ECB.
- PostgreSQL PGP com
pgp_sym_encrypt/pgp_sym_decrypte AES-256. - PostgreSQL raw com
encrypt/decrypt, tipoaes-cbc/pad:pkcs, chave AES explícita e conversão UTF-8.
PGP é o perfil padrão do PostgreSQL. O perfil raw é selecionado explicitamente e pode ser aplicado a um campo por encryptedFieldProfiles(). Os formatos são incompatíveis entre si e requerem migração para troca de perfil.
O formato MySQL legado em ECB e o formato PostgreSQL raw não autenticam ciphertext. O banco recebe a chave para executar as funções. Configure TLS e redija bindings sensíveis nos logs.
Desenvolvimento e verificação
composer install composer test find src tests -type f -name '*.php' -print0 | xargs -0 -n1 php -l
A suíte atual contém testes unitários de perfis e da SQL/bindings gerados. Ela não executa AES_ENCRYPT, pgcrypto ou consultas em servidores MySQL/PostgreSQL.
Próximas etapas
O plano detalhado, as decisões propostas e o backlog permanecem como especificação completa. A implementação iniciada atende ao núcleo dos itens LE-005 a LE-008B e LE-013/LE-014 para helpers explícitos; ainda não conclui o critério LE-002/LE-003, o ciclo automático Eloquent, interoperabilidade nem v0.1.0.
Referência
CakeAes, de Joacir Gonçalves dos Santos, é a referência de comportamento, publicada sob MIT. Os documentos do planejamento reconhecem essa origem. A licença MIT deste pacote se aplica ao código deste repositório.