Protego: безопасный обмен секретами с E2E-шифрованием
Разбираем архитектуру self-hosted сервиса для передачи паролей и файлов — шифрование в браузере, одноразовые ссылки и сравнение с Yopass
Зачем это нужно
Пароли от серверов в Telegram. API-ключи в email. SSH-ключ в Slack-треде двухлетней давности. Знакомо?
Сообщение удалить можно, но оно уже осело в бэкапах мессенджера, почтового сервера и на устройствах всех участников чата. Контроля над тем, кто и когда это прочитает — нет.
Protego решает конкретную задачу: передать секрет так, чтобы он существовал ровно до момента прочтения и был зашифрован на всём пути — включая наш собственный сервер.
Как это работает
Вся криптография выполняется в браузере через Web Crypto API. Сервер хранит зашифрованный blob и не имеет возможности его расшифровать — у него нет ни ключа, ни информации об алгоритме.
350 000 итераций PBKDF2 с SHA-512 — это порядка 100 мс на современном CPU для одного пароля. Для атакующего с GPU-кластером перебор словаря из миллиона паролей займёт около 28 часов.
Что хранит сервер
Внутри базы данных — JSON с Base64-строкой. Внутри этой строки: 1 байт флага, 32 байта соли, 12 байт IV и шифротекст. Без ключа, который знает только отправитель, это шум.
Зашифруйте и отправьте секрет прямо сейчас — без регистрации
Сравнение с Yopass
Yopass — зрелый open-source проект, который используют Spotify и Gumtree. Мы начали с него, но нам не хватило нескольких вещей.
Архитектурные различия
Yopass
OpenPGP-шифрование (гибрид клиент-сервер). Нет CSRF-защиты. Нет rate limiting. Нет API-ключей для интеграций. Нет документации API.
Protego
AES-256-GCM + PBKDF2, чистый E2E в браузере. CSRF-токены, rate limiting 20 req/s, Master Key для API. OpenAPI-документация. Database-агностика.
Одноразовые ссылки
При создании секрета можно включить режим «одноразовый». Первый GET-запрос возвращает данные и атомарно удаляет запись из базы. Повторный запрос — 404.
Эндпоинт /status позволяет проверить метаданные (тип, one-time флаг) без удаления — полезно для предпросмотра перед загрузкой.
Database-агностика
Protego не привязан к конкретному хранилищу. Интерфейс Database определяет контракт, реализация подставляется при старте через переменную окружения.
Поддерживаемые бэкенды
Redis
По умолчанию. Персистентность, TTL, pub/sub для будущих расширений.
Memcached
Лёгковесная альтернатива. Переключение одной переменной: DATABASE=memcached.
Кастомный
Реализуйте интерфейс — PostgreSQL, DynamoDB, in-memory. Один файл, без изменения логики.
Интеграция через API
Master Key позволяет использовать API из скриптов и CI/CD без CSRF-токенов.
Деплой
Один Docker-образ. Frontend вкомпилирован в Go-бинарник. Единственная внешняя зависимость — Redis или Memcached.
Итого
Protego закрывает конкретную проблему — безопасная передача секретов внутри команды и клиентам, без следов в мессенджерах и почте.
- Zero knowledge — сервер не может расшифровать данные;
- Одноразовость — секрет удаляется после первого прочтения;
- Self-hosted — данные на вашей инфраструктуре;
- Открытый код — аудит и контрибуции приветствуются.
Развернём, настроим и интегрируем с вашими процессами