Функция Bitwarden «Вход через устройство» — удобная штука: нажал уведомление, подтвердил, и ты авторизован без пароля. Но для подтверждения нужен полный клиент Bitwarden с загруженным хранилищем. Я создал Vault Approver Vaultwarden — минималистичное Flutter-приложение, которое делает ровно одно: подтверждает запросы на вход на self-hosted Vaultwarden серверах. Без доступа к хранилищу, без сохранённых паролей, только биометрия и одно нажатие.
- Зачем нужен Vault Approver Vaultwarden
- Как работает Vault Approver
- Криптографическая цепочка по шагам
- Fingerprint-фраза: защита от фишинга подтверждений
- Архитектура безопасности
- Модель угроз: от чего защищает и от чего нет
- Детали защиты
- Технический стек
- Быстрый старт
- Почему open source критичен для security-приложений
- Часто задаваемые вопросы
- Vault Approver работает с официальным Bitwarden?
- Может ли приложение получить доступ к паролям?
- Для чего нужна fingerprint-фраза?
- Что если потерять телефон?
- Есть Android-версия?
- Нужна консультация?
Зачем нужен Vault Approver Vaultwarden

Self-hosted Vaultwarden — золотой стандарт управления паролями: вы контролируете данные, сервер, правила. Но у «Входа через устройство» есть UX-проблема: официальный мобильный клиент Bitwarden загружает всё хранилище ради одного подтверждения. Это лишняя поверхность атаки для действия в одно нажатие. Vault Approver Vaultwarden убирает всё лишнее: Face ID → запрос → проверка fingerprint-фразы → подтвердить. Приложение никогда не открывает хранилище, не хранит мастер-пароль, а модель безопасности полностью end-to-end с шифрованием RSA-2048-OAEP.
Принцип тот же, что я применяю к любой чувствительной системе: инструмент, которому нужно делать одно, должен уметь делать только это. Подтверждающее приложение, которое заодно умеет читать ваши пароли, — это приложение, которое может их утечь. Поэтому это — не умеет, по конструкции, а не по политике.
Как работает Vault Approver
- Разовая настройка: URL сервера + email + мастер-пароль. Приложение вычисляет ключи через Argon2id, сохраняет user key в Keychain/Keystore за биометрией, пароль стирает
- Уведомления в реальном времени: SignalR WebSocket с бинарным протоколом MessagePack подключается к серверу. При запросе «Вход через устройство» — мгновенный push, с polling-фолбэком (5 с / 15 с / 30 с / 1 мин), если сокет отвалился
- Биометрическая разблокировка: Face ID или Touch ID при каждом запуске, без PIN, без упрощений
- Верификация по фразе: 5-словная EFF-фраза из публичного ключа запрашивающего предотвращает спуфинг
- Подтверждение в одно нажатие: RSA-2048-OAEP шифрует user key публичным ключом запрашивающего. Сервер не видит ваших ключей
Криптографическая цепочка по шагам
Весь смысл в том, что подтверждение проходит end-to-end: сервер ретранслирует шифртекст, который не может прочитать. Vault Approver точно повторяет схему ключей Bitwarden, поэтому self-hosted Vaultwarden остаётся полностью совместимым. Деривация идёт в четыре этапа:
- Master key —
masterPassword + emailпроходят через объявленный сервером KDF (Argon2id, соль = SHA-256(email), усечённая до 16 байт; или PBKDF2-SHA256 для старых серверов) и дают 32-байтовый master key. - Stretched key — master key расширяется через HKDF-Expand(SHA-256) в 64-байтовый растянутый ключ:
encKey = HKDF(info="enc", 32B)иmacKey = HKDF(info="mac", 32B). - User key — растянутый ключ через AES-256-CBC расшифровывает защищённый симметричный ключ аккаунта и даёт 64-байтовый user key. Именно он разблокирует данные хранилища — и это единственный секрет, который вообще держит подтверждающее приложение.
- Подтверждение — на каждый запрос user key шифруется через RSA-OAEP публичным ключом запрашивающего устройства. Расшифровать может только то устройство, что начало вход; сервер Vaultwarden — слепой ретранслятор.
Аутентификация на сервере использует отдельное значение — хеш мастер-пароля, вычисляемый как PBKDF2-SHA256(masterKey, соль=masterPassword, 1 итерация), — поэтому сервер проверяет вас, ни разу не получая ничего, что могло бы расшифровать хранилище. Ничего в этой цепочке не придумано для приложения: это документированный протокол Bitwarden, переписанный на Dart так, чтобы его можно было прочитать построчно.
Fingerprint-фраза: защита от фишинга подтверждений
У беспарольного подтверждения есть один неприятный сценарий: злоумышленник, знающий ваш email, инициирует запрос «Вход через устройство» и надеется, что вы по привычке нажмёте «подтвердить». Vault Approver закрывает эту брешь fingerprint-фразой — пять слов из словаря EFF, детерминированно выведенные из публичного ключа запрашивающего устройства. Та же фраза показывается на устройстве, которое просит вход. Если слова не совпали — запрос не ваш, и вы его отклоняете.
Это превращает абстрактное «легитимен ли запрос?» в конкретную пятисекундную человеческую проверку — та же идея внеполосной верификации, что стоит за safety numbers в Signal, применённая к подтверждению входа. Она не мешает запросу прийти, но мешает вам подтвердить чужой.
Архитектура безопасности
Имея 6 патентов в области информационной безопасности, я проектировал Vault Approver по принципу zero-trust. Модель безопасности держится на пяти гарантиях:
- Мастер-пароль не хранится: вводится один раз при настройке, используется для деривации ключей, затем стирается. При смене биометрии нужна повторная настройка
- Device Keychain/Keystore: user key зашифрован случайным biometric storage key, защищён Secure Enclave (iOS) или Android Keystore
- E2E-шифрование: полная Bitwarden-совместимая криптоцепочка — Argon2id KDF, HKDF-SHA256 растяжка, AES-256-CBC расшифровка ключа хранилища, обмен ключами RSA-OAEP
- Нет доступа к хранилищу: приложение вызывает только
/api/auth-requests— физически не может прочитать пароли - Нулевой сбор данных: ноль аналитики, ноль телеметрии, ноль облака. Лейбл приватности в App Store подтверждает: «Data Not Collected»
Тот же подход defense-in-depth, который я рекомендую для корпоративной ИТ-архитектуры: минимизировать поверхность атаки, шифровать всё, не доверять ничему.
Модель угроз: от чего защищает и от чего нет
Честная безопасность — это называть границы. От чего Vault Approver защищает:
- Скомпрометированный сервер — Vaultwarden ретранслирует только шифртекст, который не может прочитать, поэтому взломанный сервер не восстановит хранилище из подтверждений
- Фишинг подтверждений — fingerprint-фраза делает инициированный атакующим запрос явно неправильным
- Утечку хранилища на уровне приложения — утекать нечему: UI хранилища нет, читать пароли приложение не может в принципе
- Случайный доступ к устройству — биометрия при каждом запуске плюс авто-блокировка держат приложение за вашим лицом или отпечатком
От чего не защищает, прямым текстом: полностью скомпрометированное устройство, где атакующий может обойти биометрический слой ОС; пользователь, который подтверждает запрос с несовпавшей фразой (проверка работает, только если вы её действительно читаете); и вы по-прежнему доверяете своему серверу Vaultwarden честно ретранслировать auth-requests — хранилище он не читает, но вредоносный сервер мог бы придерживать или спамить запросами. Приложение резко сужает поверхность атаки, но не отменяет доверие к собственному железу.
Детали защиты
Помимо криптографии, несколько мелких решений снижают реальную экспозицию:
- Privacy screen: размытие на iOS и
FLAG_SECUREна Android скрывают содержимое в переключателе задач и блокируют скриншоты - Настраиваемый таймаут блокировки: сразу / 15 с / 1 мин / 5 мин / 15 мин / никогда — приложение пере-блокируется на ваших условиях
- 2FA / TOTP поддерживается при первичной настройке, в соответствии с тем, что требует ваш сервер
- Темы система / светлая / тёмная и встроенный переключатель EN/RU — инструмент подстраивается под устройство, а не наоборот
Технический стек
- Flutter + Dart (SDK ≥ 3.5): кросс-платформа — iOS в App Store, Android в бете
- State management: Riverpod 2.x для реактивного UI
- Криптография: PointyCastle 4.x + cryptography 2.x — полная Bitwarden-совместимая реализация
- Сеть: dio 5.x, web_socket_channel 3.x, msgpack_dart 1.x (SignalR + MessagePack + polling fallback)
- Безопасность: local_auth (биометрия), flutter_secure_storage (Keychain/Keystore)
- Локализация: English + Русский со встроенным переключателем
Быстрый старт
Требования: self-hosted сервер Vaultwarden с включённым «Входом через устройство» и телефон с Face ID / Touch ID (iOS) или биометрией (Android).
- Установить: Vault Approver в App Store (бесплатно, 20.9 MB)
- Подключить: URL вашего Vaultwarden сервера (например,
https://vault.yourdomain.com) - Авторизоваться: email + мастер-пароль + опционально 2FA/TOTP
- Биометрия: Face ID или Touch ID — это становится единственным способом разблокировки
- Готово: запросы «Вход через устройство» приходят мгновенно
Android-версия в открытой бете — APK на GitHub.
Почему open source критичен для security-приложений
Security-приложение, которое нельзя аудировать, — это риск. Vault Approver под MIT-лицензией, полностью открыт на GitHub. Каждая строка криптокода доступна для проверки — от деривации ключей Argon2id до обмена ключами RSA-OAEP. Никакой обфускации, скрытых сетевых вызовов, проприетарных чёрных ящиков. Для инструмента, который держит единственный ключ, способный разблокировать ваше хранилище, «доверьтесь мне» недостаточно — нужно «прочитайте код». Эта прозрачность особенно важна для организаций с чувствительными данными, которым нужно проверять, что работает на устройствах сотрудников.
Нужна помощь с настройкой self-hosted Vaultwarden для команды? Бесплатная консультация →
Часто задаваемые вопросы
Vault Approver работает с официальным Bitwarden?
Разработан для Vaultwarden, использует стандартный Bitwarden API. Может работать с официальными серверами, но основное тестирование — на Vaultwarden.
Может ли приложение получить доступ к паролям?
Нет. Vault Approver взаимодействует только с endpoint auth-requests. Нет UI хранилища, нет списка паролей, нет возможности расшифровать учётные данные. Это подтверждающее приложение, а не клиент хранилища.
Для чего нужна fingerprint-фраза?
Это 5-словная EFF-фраза из публичного ключа запрашивающего устройства, показываемая и у запрашивающего, и у подтверждающего. Совпадение фраз доказывает, что запрос действительно ваш; несовпадение значит, что его инициировал атакующий — и вы отклоняете.
Что если потерять телефон?
User key защищён биометрией устройства внутри Secure Enclave / Android Keystore. Без вашего лица или отпечатка ключ не извлечь, и хранилище в безопасности. Просто настройте Vault Approver на новом устройстве с мастер-паролем.
Есть Android-версия?
В открытой бете. Можно собрать из исходников или скачать APK с GitHub. Google Play — после завершения бета-тестирования.
Нужна консультация?
Если вам нужна профессиональная экспертиза — запишитесь на бесплатную 15-минутную консультацию.


