Open Auth — локальный аутентификатор для Android 12 и новее. У него нет собственного сервера, учётных записей Open Auth, аналитики, рекламы и платных функций. Модуль Google Drive временно выключен во всех сборках и имеет статус «В разработке». Приложение не заявлено как прошедшая независимый аудит безопасности.
Записи и группы хранятся в зашифрованном контейнере AES-256-GCM с 96-битным nonce и 128-битным тегом аутентификации. Случайный ключ данных хранилища защищён отдельным неэкспортируемым ключом Android Keystore. Для его использования Keystore требует системную аутентификацию: сильную биометрию или блокировку устройства. Окно допустимой давности аутентификации — 15 секунд; это параметр доступа к ключу, а не таймер открытой сессии приложения.
Open Auth блокирует сессию при уходе из приложения, выключении экрана и
по кнопке замка. Обычный поворот экрана не закрывает сессию. Для окна
приложения установлен FLAG_SECURE: Android ограничивает снимки экрана
и отображение содержимого на незащищённых дисплеях.
Контейнер и локальные ключевые материалы сохраняются в noBackupFilesDir.
Системное резервное копирование приложения выключено; правила извлечения
исключают облачный backup Android и перенос данных устройства. Это помогает
избежать переноса контейнера без привязанного к устройству ключа и означает,
что для восстановления нужна отдельная копия Open Auth.
При потере, удалении или инвалидировании ключа Keystore приложение не создаёт замену, способную открыть прежний контейнер. Зашифрованный файл сохраняется, а интерфейс сообщает о недоступности ключа. Снятие блокировки устройства, сброс, удаление приложения и изменения системной защиты могут повлиять на доступность ключей. Копия и её пароль должны существовать до потери доступа к телефону.
Аварийное восстановление из проверенной .oab — отдельная подтверждаемая
операция. Она не требует расшифрования прежнего хранилища. После проверки
пароля и состава копии новый ключ Keystore создаётся под отдельным именем,
а его использование требует новой системной аутентификации. Старый ключ
не удаляется. Прежний ciphertext сохраняется в закрытой области
noBackupFilesDir/vault-recovery без открытого экспорта; затем новый файл
устанавливается атомарно. Архив ограничен тремя файлами без перезаписи:
заполнение останавливает операцию. Предпросмотр привязан к состоянию сессии
и исходному ciphertext, поэтому запоздалое подтверждение не заменяет более
новое состояние. При недоступном старом файле сравнить его HOTP-счётчики
невозможно; после восстановления может потребоваться согласование с сервисом.
Файл .oab содержит полный зашифрованный снимок. Для него используется
независимый случайный ключ AES-256-GCM, отдельный от ключа локального
хранилища. Пароль или PIN преобразуется в ключ обёртки через Argon2id v1.3:
64 МиБ памяти, 3 прохода, 4 линии, результат 32 байта и случайная соль 16 байт.
Ключ обёртки защищает ключ копии, а тот шифрует содержимое. Для AES-GCM
используются nonce 96 бит и теги 128 бит; сжатия нет.
Пароль нормализуется Unicode NFC и кодируется UTF-8 без удаления пробелов или изменения регистра. Допустимы не менее 12 кодовых точек после NFC и не более 1024 байт UTF-8. PIN — отдельный режим: 8–128 ASCII-цифр, начальные нули сохраняются. Пароль копии не является паролем блокировки Android. При смене пароля создаются новый случайный ключ копии и полное поколение снимков; старые файлы остаются под старым паролем.
Получивший файл может подбирать пароль или PIN без подключения к сети. Argon2id повышает стоимость попытки, но не заменяет стойкий пароль. Короткий цифровой PIN имеет меньше вариантов, чем длинный непредсказуемый пароль. В Open Auth нет серверного восстановления пароля или ограничения числа попыток для украденного файла.
Открытое содержимое выдаётся только после проверки тега аутентификации. Неверные учётные данные и ошибка аутентичности контейнера дают общую ошибку открытия копии. Структура, фиксированный профиль KDF и размеры проверяются до запуска Argon2id. Предел файла — 16 МиБ, открытого JSON — 8 МиБ, записей — 10 000, импортируемого URI — 8 КиБ, секрета записи — 10–128 байт. Подробный контракт опубликован в формате резервной копии.
Google Drive временно выключен общим флагом приложения во всех сборках. Интерфейс не запускает выбор аккаунта, согласие или облачные операции и не показывает сохранённый адрес аккаунта. При запуске приложение отменяет ранее поставленные задачи Drive; планировщик не создаёт новые, а worker завершается до обращения к авторизации или сети. Разблокировка и изменение хранилища больше не создают автоматические облачные снимки. Файловые копии под отдельным паролем или PIN продолжают работать.
Прежние зашифрованные настройки назначения и ожидающие локальные снимки остаются неактивными. Временное выключение не отзывает ранее выданное Google-разрешение и не запрашивает удаление облачной истории. При обновлении старое подключение не возобновляет отправки. Исходный код облачного модуля и его изолированные тесты сохранены для дальнейшей разработки; это не означает доступность функции в текущем приложении. Подробнее — в описании Google Drive.
История ненулевых HOTP-счётчиков сохраняется внутри зашифрованного хранилища и переносимых копий независимо от карточек аккаунтов. Удаление карточки, временная смена её типа или длины кода не позволяют повторно выдать старый счётчик. Для удалённого генератора сохраняется только доменно-разделённый SHA-256 отпечаток секрета и максимум счётчика, без исходного OTP-секрета. История ограничена 20000 генераторами; переполнение блокирует изменение, а не удаляет прежние ограничения. Предел групп — 10000; фильтры выводятся лениво. Старые копии читаются, но схема 2 с историей не поддерживается OpenAuth 1.0.0. Уже утраченную до обновления историю приложение восстановить не может.
Восстановление применяется только после проверки копии, предварительного просмотра и подтверждения. Известные локальные HOTP-счётчики не уменьшаются; на новой установке история использования после даты копии неизвестна. При выдаче HOTP следующий счётчик сохраняется до возврата кода, чтобы сбой сохранения не приводил к выдаче с незафиксированным продвижением.
Скопированный код попадает в системный буфер обмена с пометкой чувствительного содержимого. Приложение пытается очистить его через 30 секунд при доступе к буферу, а отложенную очистку повторяет при возвращении фокуса. Очистка проверяет принадлежность содержимого, чтобы не удалить более свежий текст. Android ограничивает доступ в фоне, а завершение процесса может сбросить ожидание; точное время очистки не гарантируется. Системная автоочистка Android — отдельный механизм. Пометка чувствительности не запрещает всем другим приложениям получать доступ при разрешённых системой условиях.
Шифрование данных на диске не защищает открытые коды от вредоносной
программы с привилегиями системы, скомпрометированного Android или наблюдения
за экраном во время использования. Системная блокировка и FLAG_SECURE
снижают доступность данных в обычных сценариях, но не являются гарантией
защиты на таком устройстве.
Приложение старается очищать принадлежащие ему чувствительные байтовые массивы при завершении операции или закрытии сессии. Управляемая память, строки, JSON и криптографические библиотеки могут создавать дополнительные копии; абсолютное удаление всех следов из памяти не гарантируется.
Автоматические проверки отдельных контрактов не подтверждают все свойства конкретного телефона, живого Google OAuth или выпуска APK. Текущая регистрация OAuth сама по себе не означает, что работа с реальным аккаунтом уже проверена.