Files
laravel-gost-template/docs/security/crypto-gost.md
2026-06-24 17:20:43 +09:00

51 lines
3.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Криптографическая защита ПДн по ГОСТ (ФСБ №378)
## Зачем
Встроенный в Laravel шифратор использует **AES-256-GCM** — это надёжный
международный алгоритм, но он **не является сертифицированным в России СКЗИ**.
Для государственных ИСПДн и при выполнении требований приказа ФСБ России №378
криптографическая защита ПДн должна выполняться сертифицированными СКЗИ,
реализующими **ГОСТ Р 34.12-2015 («Кузнечик»/«Магма»)** и ГОСТ Р 34.13-2015.
## Архитектура шаблона
Шифрование изолировано за интерфейсом `App\Services\Crypto\PdnCipher`:
- `LaravelAesCipher` — реализация по умолчанию (AES-256-GCM);
- `GostCipher`**заглушка** с точкой интеграции сертифицированного СКЗИ.
Драйвер выбирается параметром `SECURITY_PDN_CIPHER_DRIVER` (`laravel` | `gost`)
в `config/security.php`. Модели не зависят от конкретного алгоритма — они
используют трейт `HasPdnEncryption`, который обращается к `PdnCipher`.
## Как подключить КриптоПро CSP / VipNet
1. Установите СКЗИ на сервер (КриптоПро CSP с действующей лицензией, или ПАК).
2. Создайте ключевой контейнер и задайте параметры в `.env`:
```dotenv
SECURITY_PDN_CIPHER_DRIVER=gost
SECURITY_GOST_BINARY=/opt/cprocsp/bin/amd64/csptest
SECURITY_GOST_CONTAINER="\\\\.\\HDIMAGE\\pdn-key"
```
3. Реализуйте методы `encrypt()` / `decrypt()` в `App\Services\Crypto\GostCipher`.
Возможные способы интеграции:
- вызов CLI КриптоПро (`csptest`, `cryptcp`) через `Symfony\Component\Process`;
- PHP-расширение с поддержкой ГОСТ (engine `gost` для OpenSSL, при наличии);
- gRPC/REST-шлюз к выделенному криптосервису (HSM/КриптоПро DSS).
## Обязательные требования к реализации
- Ключи СКЗИ хранятся в защищённом носителе/контейнере, **не** в `.env` и не в БД.
- Разделение ключей: ключ ПДн ≠ `APP_KEY` ≠ `AUDIT_HMAC_KEY` ≠ `SECURITY_PSEUDONYM_KEY`.
- Перешифрование при компрометации/смене ключа — предусмотрите миграционную
команду (artisan) для перешифровки полей.
- Используйте `GostCipher::isAvailable()` в health-check перед включением драйвера.
- Применение конкретного СКЗИ должно соответствовать его формуляру и классу КС.
## Важное предупреждение
Не оставляйте `SECURITY_PDN_CIPHER_DRIVER=gost` с нереализованным `GostCipher` —
методы выбрасывают исключение, что прервёт работу с ПДн. Это сделано намеренно,
чтобы исключить ложное ощущение сертифицированной защиты.