Go to file
2022-12-24 03:05:07 +01:00
.devcontainer upgrade devcontainer to Python 3.11 2022-10-31 22:11:55 +01:00
.github fix ci jobs 2022-12-24 03:05:07 +01:00
.vscode add python to vscode recommended extensions 2022-12-19 17:48:17 +01:00
protobuf_generated_python upgrade to protobuf 4.21.5, add quiet mode, refactor code, add unit test 2022-09-03 14:55:17 +02:00
test Add the ability so provide an image file as the infile. If the file contains a QR code generated by Google Authenticator's "Transfer Accounts" function, it will be decoded directly in a single step. This is meant to help users who need to access their secrets from Google Authenticator but don't have a QR code decoder and don't want to use an online one due to security concerns. 2022-12-23 10:17:04 +01:00
.editorconfig Initial 2020-05-23 08:51:41 +02:00
.flake8 fix optional QRCode import 2022-09-03 23:46:05 +02:00
.gitignore add pip installation; improve README 2022-12-10 12:23:13 +01:00
devbox.json add a devbox.json to convenientally run this 2022-09-03 11:13:45 +02:00
Dockerfile Add docker as installation option (#23) 2022-11-19 09:18:24 +01:00
example_export.txt add utf-8 encoding tests 2022-12-19 22:37:23 +01:00
example_keepass_output.hotp.csv add keepass csv export; improve hotp 2022-12-04 16:19:30 +01:00
example_keepass_output.totp.csv add utf-8 encoding tests 2022-12-19 22:37:23 +01:00
example_output.csv add utf-8 encoding tests 2022-12-19 22:37:23 +01:00
example_output.json add utf-8 encoding tests 2022-12-19 22:37:23 +01:00
extract_otp_secret_keys.code-workspace add debug launch config for folder and workspace 2022-09-07 21:49:29 +02:00
extract_otp_secret_keys.py refactor code: extract method 2022-12-24 02:56:40 +01:00
google_auth.proto Initial 2020-05-23 08:51:41 +02:00
LICENSE Add GPL3 LICENSE 2022-09-03 18:23:30 +02:00
Pipfile WIP 2022-12-24 01:59:35 +01:00
Pipfile.lock WIP 2022-12-24 01:59:35 +01:00
README.md fix macOS ci 2022-12-24 02:37:16 +01:00
requirements-dev.txt WIP 2022-12-24 01:59:35 +01:00
requirements.txt Add the ability so provide an image file as the infile. If the file contains a QR code generated by Google Authenticator's "Transfer Accounts" function, it will be decoded directly in a single step. This is meant to help users who need to access their secrets from Google Authenticator but don't have a QR code decoder and don't want to use an online one due to security concerns. 2022-12-23 10:17:04 +01:00
setup.py add pip installation; improve README 2022-12-10 12:23:13 +01:00
test_extract_otp_secret_keys_pytest.py WIP 2022-12-24 01:59:35 +01:00
test_extract_otp_secret_keys_unittest.py WIP 2022-12-24 01:59:35 +01:00
test_extract_qrcode_unittest.py WIP 2022-12-24 01:59:35 +01:00
upgrade_deps.sh ci: setup testing for linux, macos and windows platforms 2022-12-18 23:06:52 +01:00
utils.py WIP 2022-12-24 01:59:35 +01:00

Extract TOTP/HOTP secret keys from Google Authenticator

CI Status PyPI - Python Version GitHub Pipenv locked Python version protobuf version License GitHub tag (latest SemVer) Stand With Ukraine


Extract two-factor authentication (2FA, TFA, OTP) secret keys from export QR codes of "Google Authenticator" app. The secret and otp values can be printed and exported to json or csv. The QR codes can be printed or saved as PNG images.

Installation

git clone https://github.com/scito/extract_otp_secret_keys.git cd extract_otp_secret_keys

Usage

  1. Open "Google Authenticator" app on the mobile phone

  2. Export the QR codes from "Google Authenticator" app

  3. Read QR codes with a QR code reader (e.g. from another phone)

  4. Save the captured QR codes in the QR code reader to a text file, e.g. example_export.txt. Save each QR code on a new line. (The captured QR codes look like otpauth-migration://offline?data=...)

  5. Transfer the file to the computer where his script is installed.

  6. Call this script with the file as input:

    python extract_otp_secret_keys.py example_export.txt

Program help: arguments and options

usage: extract_otp_secret_keys.py [-h] [--json FILE] [--csv FILE] [--keepass FILE] [--printqr] [--saveqr DIR] [--verbose | --quiet] infile

positional arguments:
  infile                   1) file or - for stdin with "otpauth-migration://..." URLs separated by newlines, lines starting with # are ignored; 2) image file containing a QR code or = for stdin for an image containing a QR code

options:
  -h, --help               show this help message and exit
  --json FILE, -j FILE     export json file or - for stdout
  --csv FILE, -c FILE      export csv file or - for stdout
  --keepass FILE, -k FILE  export totp/hotp csv file(s) for KeePass, - for stdout
  --printqr, -p            print QR code(s) as text to the terminal (requires qrcode module)
  --saveqr DIR, -s DIR     save QR code(s) as images to the given folder (requires qrcode module)
  --verbose, -v            verbose output
  --quiet, -q              no stdout output, except output set by -

Dependencies

pip install -r requirements.txt

Linux and macOS

For reading QR codes the zbar lib must be installed

Windows

The zbar DLLs are included with the Windows Python wheels. On other operating systems, you will need to install the zbar shared library.

Mac OS X

brew install zbar

Linux

sudo apt-get install libzbar0

Known to work with

  • Python 3.10.8, protobuf 4.21.9, qrcode 7.3.1, and pillow 9.2
  • Python 3.11.1, protobuf 4.21.12, qrcode 7.3.1, and pillow 9.2

For protobuf versions 3.14.0 or similar or Python 3.6, use the extract_otp_secret_keys version 1.4.0.

Examples

Printing otp secrets form text file

python extract_otp_secret_keys.py example_export.txt

Printing otp secrets from stdin

python extract_otp_secret_keys.py - < example_export.txt

Printing otp secrets from image

python extract_otp_secret_keys.py test/test_googleauth_export.png

Printing otp secrets from stdin (image)

python extract_otp_secret_keys.py = < test/test_googleauth_export.png

Printing otp secrets csv to stdout

python extract_otp_secret_keys.py --csv - example_export.txt

Features

  • Free and open source
  • Supports Google Authenticator export
  • All functionality in one Python script: extract_otp_secret_keys.py (except protobuf generated code in protobuf_generated_python)
  • Supports TOTP and HOTP
  • Generates QR codes
  • Various export formats:
    • CSV
    • JSON
    • Dedicated CSV for KeePass
    • QR code images
  • Supports reading from stdin and writing to stdout by specifying '-'
  • Errors and warnings are written to stderr
  • Many ways to run the script:
    • Native Python
    • pipenv
    • venv
    • Docker
    • VSCode devcontainer
    • devbox
    • pip

KeePass

KeePass 2.51 (released in May 2022) and newer support the generation of OTPs (TOTP and HOTP).

KeePass can generate the second factor password (2FA) if the OTP secret is stored in TimeOtp-Secret-Base32 string field for TOTP or HmacOtp-Secret-Base32 string field for HOTP. You view or edit them in entry dialog on the 'Advanced' tab page.

KeePass provides menu commands in the main window for generating one-time passwords ('Copy HMAC-Based OTP', 'Show HMAC-Based OTP', 'Copy Time-Based OTP', 'Show Time-Based OTP'). Furthermore, one-time passwords can be generated during auto-type using the {HMACOTP} and {TIMEOTP} placeholders.

In order to simplify the usage of the second factor password generation in KeePass a specific KeePass CSV export is available with option -keepass or -k. This KeePass CSV file can be imported by the "Generic CSV Importer" of KeePass.

If TOTP and HOTP entries have to be exported, then two files with an intermediate suffix .totp or .hotp will be added to the KeePass export filename.

Example:

  • Only TOTP entries to export and parameter --keepass example_keepass_output.csv
    → example_keepass_output.csv with TOTP entries will be exported
  • Only HOTP entries to export and parameter --keepass example_keepass_output.csv
    → example_keepass_output.csv with HOTP entries will be exported
  • If both TOTP and HOTP entries to export and parameter --keepass example_keepass_output.csv
    → example_keepass_output.totp.csv with TOTP entries will be exported
    → example_keepass_output.hotp.csv with HOTP entries will be exported

Import CSV with TOTP entries in KeePass as

  • Title
  • User Name
  • String (TimeOtp-Secret-Base32)
  • Group (/)

Import CSV with HOTP entries in KeePass as

  • Title
  • User Name
  • String (HmacOtp-Secret-Base32)
  • String (HmacOtp-Counter)
  • Group (/)

KeePass can be used as a backup for one time passwords (second factor) from the mobile phone.

Technical background

The export QR code of "Google Authenticator" contains the URL otpauth-migration://offline?data=.... The data parameter is a base64 encoded proto3 message (Google Protocol Buffers).

Command for regeneration of Python code from proto3 message definition file (only necessary in case of changes of the proto3 message definition or new protobuf versions):

protoc --python_out=protobuf_generated_python google_auth.proto

The generated protobuf Python code was generated by protoc 21.12 (https://github.com/protocolbuffers/protobuf/releases/tag/v21.12).

References

Glossary

  • OTP = One-time password
  • TOTP = Time-based one-time password
  • HOTP = HMAC-based one-time password (using a counter)
  • 2FA = Second factor authentication
  • TFA = Two factor authentication
  • QR code = Quick response code

Alternative installation methods

pip

pip install git+https://github.com/scito/extract_otp_secret_keys
python -m extract_otp_secret_keys

Example

wget https://raw.githubusercontent.com/scito/extract_otp_secret_keys/master/example_export.txt
python -m extract_otp_secret_keys example_export.txt

pipenv

You can you use Pipenv for running extract_otp_secret_keys.

pipenv --rm
pipenv install
pipenv shell
python extract_otp_secret_keys.py example_export.txt

Visual Studio Code Remote - Containers / VSCode devcontainer

You can you use VSCode devcontainer for running extract_otp_secret_keys.

Requirement: Docker

  1. Start VSCode
  2. Open extract_otp_secret_keys.code-workspace
  3. Open VSCode command palette (Ctrl-Shift-P)
  4. Type command "Remote-Containers: Reopen in Container"
  5. Open integrated bash terminal in VSCode
  6. Execute: python extract_otp_secret_keys.py example_export.txt

venv

Alternatively, you can use a python virtual env for the dependencies:

python -m venv venv
. venv/bin/activate
pip install -r requirements-dev.txt
pip install -r requirements.txt

The requirements*.txt files contain all the dependencies (also the optional ones). To leave the python virtual env just call deactivate.

devbox

Install devbox, which is a wrapper for nix. Then enter the environment with Python and the packages installed with:

devbox shell

Docker

Install Docker.

Build and run the app within the container:

docker build . -t extract_otp
docker run --rm -v "$(pwd)":/files:ro extract_otp -p example_export.txt

Tests

PyTest

There are basic pytests, see test_extract_otp_secret_keys_pytest.py.

Run tests:

pytest

or

python -m pytest

unittest

There are basic unittests, see test_extract_otp_secret_keys_unittest.py.

Run tests:

python -m unittest

VSCode Setup

Setup for running the tests in VSCode.

  1. Open VSCode command palette (Ctrl-Shift-P)
  2. Type command "Python: Configure Tests"
  3. Choose unittest or pytest. (pytest is recommended, both are supported)
  4. Set ". Root" directory

Maintenance

Upgrade pip Packages

pip install -U -r requirements.txt
  • ZBar is an open source software suite for reading bar codes from various sources, including webcams.
  • Aegis Authenticator is a free, secure and open source 2FA app for Android.
  • Android OTP Extractor can extract your tokens from popular Android OTP apps and export them in a standard format or just display them as QR codes for easy importing. [Requires a rooted Android phone.]
  • Python QReader
  • pyzbar

#StandWithUkraine 🇺🇦

I have Ukrainian relatives and friends.

#RussiaInvadedUkraine on 24 of February 2022, at 05:00 the armed forces of the Russian Federation attacked Ukraine. Please, stand with Ukraine, stay tuned for updates on Ukraine's official sources and channels in English and support Ukraine in its fight for freedom and democracy in Europe.