> MARAT_SHVETS.portfolio
> cd ../projects
012
Security · Fullstack

Vault — свой менеджер паролей для команды

Fullstack-разработчик·2026 · в разработке

Свой сервис для хранения паролей команды — без доверия чужим облакам, с надёжным шифрованием и безопасным обменом доступами.

Node.jsReactPostgreSQLSecurityAES-256-GCM
3 ключа
Нужно похитить, чтобы взломать
Итераций PBKDF2-SHA512310 000
Независимых секретов для ключа3
Миграция схемы деривациибез простоя, без потери данных
Функции безопасности2FA, генератор паролей, оценка надёжности
// ПРОБЛЕМА

Пароли и доступы команды хранились где придётся — в заметках, текстовых файлах и переписках, и постоянно терялись. Готовые менеджеры паролей не подходили: либо облако и доверие чужим серверам, либо self-hosted решения с интерфейсом не под наш процесс. Нужен был свой инструмент — со своими пользователями, ролями и безопасным шарингом доступов.

// ПРОЦЕСС
01
Шифрование записей

Выбрал AES-256-GCM: конфиденциальность плюс проверка целостности через authentication tag, что позволяет обнаружить подмену зашифрованных данных. Каждая запись шифруется собственным случайным IV, поэтому одинаковые пароли не превращаются в одинаковые шифротексты.

02
Деривация ключа из трёх секретов

Ключ шифрования нигде не хранится в явном виде — выводится на лету через PBKDF2-SHA512 с 310 000 итераций из мастер-пароля пользователя, серверного "перца" (pepper) и секрета из отдельного ключевого файла. Кражи одного-двух из трёх секретов недостаточно для офлайн-подбора: без ключевого файла даже похищенная база и серверные настройки бесполезны для атакующего.

03
Миграция схемы деривации без простоя

При усилении схемы (добавлении ключевого файла) старые данные остались зашифрованы по прежней схеме. Полная переиндексация базы "на живую" была рискованной, поэтому сделал миграцию: старая деривация осталась в коде только как одноразовый путь пересчёта, новые записи используют исключительно усиленную схему.

04
Безопасный шаринг записей в команде

Личные пароли шифруются ключом, привязанным к конкретному пользователю, — сервер не может прочитать их напрямую. Для расшаренных копий сделал отдельный механизм, в котором сервер способен их расшифровать — осознанный компромисс между удобством шаринга и уровнем защиты. Ключевой файл вынесен отдельно от сервера и БД, чтобы доступ к приложению сам по себе не давал возможности расшифровать данные.

// РЕШЕНИЕ

Vault хранит пароли команды в PostgreSQL, зашифрованными AES-256-GCM с ключом, который выводится из трёх независимых секретов и нигде не хранится целиком. Личные записи расшифровывает только владелец, расшаренные — по отдельному защищённому механизму.

// РЕЗУЛЬТАТЫ
310 000
Итераций PBKDF2-SHA512
3
Независимых секретов для ключа
без простоя, без потери данных
Миграция схемы деривации
2FA, генератор паролей, оценка надёжности
Функции безопасности
// СТЕК
Node.jsReactPostgreSQLAES-256-GCMPBKDF2-SHA5122FA