Найти в Дзене
@postnikovstas

Как шифровать данные в Laravel и спать спокойно? Логины, пароли, токены - под замком

В работе с API поставщиков я столкнулся с задачей: как безопасно хранить их логины, пароли и токены доступа, не нарушая безопасность приложения и при этом обеспечивая удобное управление через админку. Решение оказалось одновременно простым и мощным - встроенное шифрование Laravel, которое идеально интегрируется с кастомными типами данных и работает совместно с админ-панелью Orchid. Когда мы говорим о логинах, паролях, ключах доступа, персональных данных - первое правило безопасности: не хранить их в открытом виде в базе данных. Во многих системах я видел практику, когда: Что произойдёт при утечке? Ответ очевиден. Laravel имеет мощное API для шифрования данных - Crypt::encrypt() и Crypt::decrypt(). Но использовать его вручную для каждой записи - неудобно. К счастью, в Laravel можно настроить автоматическое шифрование поля модели с помощью кастомного Cast класса. namespace App\Casts;
use Illuminate\Contracts\Database\Eloquent\CastsAttributes;
use Illuminate\Support\Facades\Crypt;
cla
Оглавление

Я шифрую важные данные в Laravel + Orchid. И почему вы тоже должны это делать?

В работе с API поставщиков я столкнулся с задачей: как безопасно хранить их логины, пароли и токены доступа, не нарушая безопасность приложения и при этом обеспечивая удобное управление через админку.

Решение оказалось одновременно простым и мощным - встроенное шифрование Laravel, которое идеально интегрируется с кастомными типами данных и работает совместно с админ-панелью Orchid.

Проблема: как хранить чувствительные данные безопасно?

Когда мы говорим о логинах, паролях, ключах доступа, персональных данных - первое правило безопасности: не хранить их в открытом виде в базе данных.

Во многих системах я видел практику, когда:

  • API-ключи лежат в JSON колонке в базе.
  • Пароли передаются и сохраняются как есть.
  • Права доступа к базе даны всем разработчикам.

Что произойдёт при утечке? Ответ очевиден.

Решение: встроенное шифрование Laravel

Laravel имеет мощное API для шифрования данных - Crypt::encrypt() и Crypt::decrypt(). Но использовать его вручную для каждой записи - неудобно. К счастью, в Laravel можно настроить автоматическое шифрование поля модели с помощью кастомного Cast класса.

Пример: EncryptedJson

namespace App\Casts;

use Illuminate\Contracts\Database\Eloquent\CastsAttributes;
use Illuminate\Support\Facades\Crypt;

class EncryptedJson implements CastsAttributes
{
public function get($model, string $key, $value, array $attributes)
{
return json_decode(Crypt::decryptString($value), true);
}

public function set($model, string $key, $value, array $attributes)
{
return Crypt::encryptString(json_encode($value));
}
}

Простой каст - и теперь всё, что мы передаём в поле credentials, автоматически шифруется при сохранении и расшифровывается при получении.

Как это работает с Orchid

Я использую Orchid Admin Panel в моих приложениях и чтобы управлять поставщиками через красивую форму создаю подобные экраны.

Вот пример экрана редактирования поставщика:

Matrix::make('supplier.credentials')
->title('Учетные данные!')
->columns([
'Поле' => 'name',
'Значение' => 'value',
]),

В админке я заполняю, например:

login: some_user
password: secret
token: ABC123XYZ

В контроллере всё преобразуется в массив и попадает в модель, где через EncryptedJson шифруется и уходит в базу.

В базе данных - ничего нельзя прочитать без ключа приложения. Даже я сам не смогу сделать.

А насколько это безопасно?

Laravel использует AES-256-CBC, один из самых надёжных симметричных алгоритмов, плюс генерирует уникальный IV (инициализирующий вектор) при каждом шифровании.

Также Laravel добавляет MAC (контрольную подпись), чтобы убедиться, что данные не были подменены.

Важно: всё держится на APP_KEY - если он скомпрометирован, безопасность рушится. Его нельзя коммитить в git и желательно держать в .env.

Подходит ли это для хранения персональных данных клиентов?

Да!

Этот подход идеально подходит для:

  • хранения паспортных данных,
  • телефонов, email'ов, адресов,
  • любой чувствительной информации, которую вы обязаны защищать по закону (например, 152-ФЗ в России или GDPR в ЕС).

Преимущества:

✅ Легко использовать

✅ Интегрируется с формами

✅ Работает как обычное поле модели

✅ Невозможно прочитать без ключа приложения

✅ Можно логировать действия (я использую
OwenIt\Auditing)

Пример на практике

В Orchid Admin я добавил и сохранил такие поля:

{
"login": "user123",
"password": "mypassword",
"token": "abc123xyz"
}

А в базе это выглядит как длинная строка типа:

eyJpdiI6InRTUnplV3FvSlZUY0... (Base64)

Без APP_KEY вы не расшифруете это даже через Laravel.

Когда стоит внедрить такую защиту?

  • Если вы храните API-ключи, секреты, логины, пароли поставщиков
  • Если у вас есть CRM или маркетплейс, и вы храните данные клиентов
  • Если вы разрабатываете SaaS-систему
  • Если у вас юридическая ответственность за хранение персональных данных

Вывод

Использовать встроенное шифрование Laravel - быстро, безопасно и правильно. Сочетая это с кастомным Cast, вы можете обернуть любые поля в автоматическую защиту без лишнего кода.

Мой совет: если ваши данные ценны - зашифруйте их.

Не оставляйте безопасность «на потом». Это тот случай, когда лучше потратить 15 минут сегодня, чем потерять всё завтра.

Если вы хотите безопасно хранить API-ключи, персональные данные или реализовать шифрование в вашем проекте — пишите мне. Помогу внедрить подобную защиту данных под требования ФЗ-152 и не только.

Telegram: @postnikovstas