Шукати в цьому блозі

неділя, 13 вересня 2026 р.

Перенос 2FA з Google Authenticator у GNOME Authenticator (Debian/GNOME)

Проблема

GNOME Authenticator (com.belmoussaoui.Authenticator, Flatpak/Flathub) не вміє напряму читати QR-код "Transfer accounts / Export accounts" з Google Authenticator. Цей QR несе спеціальний формат otpauth-migration://offline?data=... (base64 + Protocol Buffers), а не звичайний otpauth://, який очікує сканер додатку. Ні камера, ні скріншот-сканер це не підхоплюють. Це підтверджений баг/обмеження проєкту, а не помилка користувача.

Рішення: extract_otp_secrets

Репозиторій: https://github.com/scito/extract_otp_secrets (⚠️ раніше називався extract_otp_secret_keys — якщо гуглиться стара назва, файл скрипта тепер лежить у src/extract_otp_secrets.py, не в корені).

Скрипт розбирає otpauth-migration://... і віддає звичайні otpauth:// записи (або одразу JSON/CSV/Aegis-експорт).

Кроки

  1. Отримати сирі дані з QR. На телефоні: Google Authenticator → меню → Transfer accounts → Export accounts → з'являється QR. Відсканувати його будь-яким сканером QR (не обов'язково камерою ПК) — вийде текстовий рядок otpauth-migration://offline?data=.... Якщо QR декілька (багато акаунтів) — кожен рядок в окремий рядок текстового файлу.

  2. Зберегти рядок(и) у текстовий файл, наприклад export.txt (по одному otpauth-migration://... на рядок).

  3. Встановити скрипт в ізольований venv (щоб не смітити систему):

    git clone https://github.com/scito/extract_otp_secrets.git
    cd extract_otp_secrets
    python3 -m venv venv && source venv/bin/activate
    pip install -r requirements.txt
    

    ⚠️ requirements.txt тягне важкі й непотрібні для цього кейсу пакети (torch, opencv, CUDA — потрібні лише для розпізнавання QR з фото/камери через YOLO). Якщо на вході вже готовий текстовий рядок (data=...), а не картинка — усе це зайве, але видалити з requirements.txt важко без ризику зламати залежності, тому просто змиритися й прибрати venv після використання (розділ "Прибирання").

  4. Розпарсити:

    python3 src/extract_otp_secrets.py export.txt --json result.json
    

    Отримаєш name, issuer, secret, algorithm для кожного акаунту.

  5. Завести кожен акаунт у GNOME Authenticator вручну — кнопка "+" → ручний ввід (Issuer / Account / Secret) з даних result.json.

  6. Перенос на інші машини (робочий ПК тощо). Скрипт вміє одразу експортувати у формат, який читає Aegis (--json/--csv + опціонально шифрований контейнер) — так і зробили: експорт у формат Aegis із паролем, файл переносимо на інший комп'ютер і імпортуємо туди штатним імпортом Aegis-бекапу. Зручно, якщо кінцевий застосунок на іншій машині підтримує Aegis-формат краще, ніж пряме ручне заведення.

Прибирання (важливо!)

Проміжні файли містять секрети у відкритому вигляді:

shred -u export.txt result.json

Зашифрований Aegis-експорт (з паролем) можна лишити для переносу, але краще не тримати його довше, ніж треба, і не в хмарних синках без додаткового шифрування диску.

venv зі скриптом важить кілька гігабайт (torch + CUDA-пакети) — після використання просто видалити разом з клоном:

deactivate
rm -rf extract_otp_secrets   # або шлях, куди клонував

Підсумок / чеклист на майбутнє

  • [ ] GNOME Authenticator сам QR від Google Authenticator не читає — одразу
    йти шляхом extract_otp_secrets, не гаяти час на спроби сканування.
    
  • [ ] Файл скрипта: src/extract_otp_secrets.py (не в корені).
  • [ ] Вхід: текстовий файл з otpauth-migration://..., без картинок —
    найпростіший і найшвидший шлях, важкі image-залежності можна
    ігнорувати.
    
  • [ ] Після імпорту — shred проміжних файлів, видалення venv.

Немає коментарів: