Giter Site home page Giter Site logo

scito / extract_otp_secrets Goto Github PK

View Code? Open in Web Editor NEW
966.0 7.0 121.0 34.32 MB

Extract one time password (OTP) secrets from QR codes exported by two-factor authentication (2FA) apps such as "Google Authenticator". The exported QR codes from authentication apps can be captured by camera, read from images, or read from text files. The secrets can be exported to JSON or CSV, or printed as QR codes to console.

Home Page: https://scito.ch/content/extract-secret-keys-google-authenticator-qr-export

License: GNU General Public License v3.0

Python 74.05% Dockerfile 2.46% Shell 23.49%
otp otpauth python recovery google-authenticator proto3 totp qr-codes tfa csv

extract_otp_secrets's Introduction

Extract TOTP/HOTP secrets from QR codes exported by two-factor authentication apps

CI tests CI docker coverage License GitHub release (latest SemVer)
python versions Docker image Linux Windows MacOS Download executable
Stand With Ukraine


The Python script extract_otp_secrets.py extracts one time password (OTP) secrets from QR codes exported by two-factor authentication (2FA) apps such as "Google Authenticator". The exported QR codes from authentication apps can be read in three ways:

  1. Capture the QR codes with the system camera using a GUI, πŸ†•
  2. Read image files containing the QR codes, and πŸ†•
  3. Read text files containing the QR code data generated by third-party QR readers.

The secrets can be exported to JSON or CSV, or printed as QR codes to console or saved as PNG.

⚑ This project/script was renamed from extract_otp_secret_keys to extract_otp_secrets. ⚑

Table of contents

Table of contents

Download and run binary executable (πŸ†• since v2.1)

  1. Download executable for your platform from latest release, see assets
  2. Linux and macOS: Set executable bit for the downloaded file, e.g in terminal with chmod +x extract_otp_secrets_X.Y.Z_OS_ARCH
  3. Start executable by clicking or from command line (macOS: startable only from command line, see below)

βœ”οΈ Everything is just packed in one executable.
βœ”οΈ No installation needed, neither Python nor any dependencies have to be installed.
βœ”οΈ Easy and convenient

ℹ️ There is a delay after starting the executable since the files have internally to be unpacked.

ℹ️ If you are a developer, you might prefer to run the Python script directly, see Installation

⚠️ Some antivirus tools may show a virus or trojan alert for the executable. This alert is a false positive. This is a known problem for executables generated by PyInstaller. If you have any doubt, please use directly the Python script.

ℹ️ The executables are not signed. Thus, the operating system may show a warning about download from unknown source.

MacOS

Beginning in macOS 10.15, all software built after June 1, 2019, and distributed with Developer ID must be notarized. However, you aren’t required to notarize software that you distribute through the Mac App Store because the App Store submission process already includes equivalent security checks. developer.apple.com

❌ Unfortunately, I cannot provide a signed and notarized installable application for macOS as .dmg or .pkg. Apple is not Open Source friendly and requires a yearly Developer ID subscription. I am not willing to pay USD 99 per year to Apple for this little open source tool.

However, the bare executable can be executed from the command line:

  1. Download executable for macOS platform from latest release, see assets
  2. Open Terminal application
  3. Change to Downloads folder in Terminal: cd $HOME/Downloads
  4. Remove quarantine bit for the downloaded file: xattr -r -d com.apple.quarantine extract_otp_secrets_X.Y.Z_macos_x86_64
  5. Set executable bit for the downloaded file: chmod +x extract_otp_secrets_X.Y.Z_macos_x86_64
  6. Start executable from command line: ./extract_otp_secrets_X.Y.Z_macos_x86_64

ℹ️ Replace X.Y.Z in above commands with the version number of your downloaded file, e.g. extract_otp_secrets_2.4.0_macos_x86_64

ℹ️ If Rosetta2 emulation is installed, these steps work also for M1 and M2 Apple Silicon processors and the program can be executed directly.

⚠️ It seems the GUI mode is not working in Terminal on macOS. In tests no GUI window was opened. (Remarks and hints about macOS are welcome since I do not know macOS.)

Usage

Capture QR codes from camera (πŸ†• since version 2.0)

  1. Open "Google Authenticator" app on the mobile phone
  2. Export the QR codes from "Google Authenticator" app (see how to export)
  3. Point the exported QR codes to the camera of your computer
  4. Run the program without infile parameters:
extract_otp_secrets

CV2 Capture from camera screenshot

Detected QR codes are surrounded with a frame. The color of the frame indicates the extracting result:

  • Green: The QR code is detected, decoded and the OTP secret was successfully extracted.
  • Red: The QR code is detected and decoded, but could not be successfully extracted. This is the case if a QR code not containing OTP data is captured.
  • Magenta: The QR code is detected, but could not be decoded. The QR code should be presented better to the camera or another QR reader could be used.

Key commands:

  • Space: change QR code reader
  • C: save as csv file (πŸ†• since v2.2)
  • J: save as json file (πŸ†• since v2.2)
  • K: save as KeePass csv file (πŸ†• since v2.2)
  • ESC, ENTER, Q: quit the program

The secrets are printed by default to the console. Set program parameters for other types of output, e.g. --csv exported_secrets.csv.

With builtin QR decoder from image files (πŸ†• since version 2.0)

  1. Open "Google Authenticator" app on the mobile phone
  2. Export the QR codes from "Google Authenticator" app (see how to export)
  3. Save the QR code as image file, e.g. example_export.png
  4. Transfer the images files to the computer where his script is installed.
  5. Call this script with the file as input:
extract_otp_secrets example_export.png
  1. Remove unencrypted files with secrets from your computer and mobile.

With external QR decoder app from text files

  1. Open "Google Authenticator" app on the mobile phone
  2. Export the QR codes from "Google Authenticator" app (see how to export)
  3. Read QR codes with a third-party QR code reader (e.g. from another phone)
  4. Save the captured QR codes from 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:
extract_otp_secrets example_export.txt
  1. Remove unencrypted files with secrets from your computer and mobile.

Installation of Python script (recommended for developers or advanced users)

git clone https://github.com/scito/extract_otp_secrets.git
cd extract_otp_secrets
pip install -U -r requirements.txt

python src/extract_otp_secrets.py example_export.txt

In case this script is not starting properly, the debug mode can be activated by adding parameter -d in the command line.

Installation of optional shared system libraries (recommended)

For reading QR codes with ZBAR QR reader, the zbar library must be installed. If you do not use the ZBAR QR reader, you do not need to install the zbar shared library. Note: The ZBAR QR reader is the showed for me the best results and is thus default QR Reader.

For a detailed installation documentation of pyzbar.

Linux (Debian, Ubuntu, …)

sudo apt-get install libzbar0

Linux (OpenSUSE)

sudo zypper install libzbar0

Linux (Fedora)

sudo dnf install zbar

Linux (Arch Linux)

pacman -S zbar

Mac OS X

brew install zbar

Windows

zbar

The zbar DLLs are included with the Windows Python wheels. However, you might need additionally to install Visual C++ Redistributable Packages for Visual Studio 2013. Install vcredist_x64.exe if using 64-bit Python, vcredist_x86.exe if using 32-bit Python. For more information see pyzbar

OpenCV (CV2)

OpenCV requires Visual C++ redistributable 2015. For more information see opencv-python

Program help: arguments and options

usage: extract_otp_secrets.py [-h] [--csv FILE] [--keepass FILE] [--json FILE] [--txt FILE] [--urls FILE] [--printqr] [--saveqr DIR] [--camera NUMBER] [--qr {ZBAR,QREADER,QREADER_DEEP,CV2,CV2_WECHAT}] [-i] [--no-color] [--version] [-d | -v | -q] [infile ...]

Extracts one time password (OTP) secrets from QR codes exported by two-factor authentication (2FA) apps
If no infiles are provided, a GUI window starts and QR codes are captured from the camera.

positional arguments:
  infile                        a) file or - for stdin with 'otpauth-migration://...' URLs separated by newlines, lines starting with # are ignored;
                                b) 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
  --csv FILE, -c FILE           export csv file, or - for stdout
  --keepass FILE, -k FILE       export totp/hotp csv file(s) for KeePass, - for stdout
  --json FILE, -j FILE          export json file or - for stdout
  --txt FILE, -t FILE           export txt file or - for stdout
  --urls FILE, -u FILE          export file with list of otpauth urls, or - for stdout
  --printqr, -p                 print QR code(s) as text to the terminal
  --saveqr DIR, -s DIR          save QR code(s) as images to directory
  --camera NUMBER, -C NUMBER    camera number of system (default camera: 0)
  --qr {ZBAR,QREADER,QREADER_DEEP,CV2,CV2_WECHAT}, -Q {ZBAR,QREADER,QREADER_DEEP,CV2,CV2_WECHAT}
                                QR reader (default: ZBAR)
  -i, --ignore                  ignore duplicate otps
  --no-color, -n                do not use ANSI colors in console output
  --version, -V                 print version and quit
  -d, --debug                   enter debug mode, do checks and quit
  -v, --verbose                 verbose output
  -q, --quiet                   no stdout output, except output set by -

examples:
python extract_otp_secrets.py
python extract_otp_secrets.py example_*.txt
python extract_otp_secrets.py - < example_export.txt
python extract_otp_secrets.py --csv - example_*.png | tail -n+2
python extract_otp_secrets.py = < example_export.png

Examples

Printing otp secrets form text file

python src/extract_otp_secrets.py example_export.txt

Printing otp secrets from image file

python src/extract_otp_secrets.py example_export.png

Writing otp secrets to csv file

python src/extract_otp_secrets.py -q --csv extracted_secrets.csv example_export.txt

Writing otp secrets to json file

python src/extract_otp_secrets.py -q --json extracted_secrets.json example_export.txt

Printing otp secrets multiple files

python src/extract_otp_secrets.py example_*.txt
python src/extract_otp_secrets.py example_*.png
python src/extract_otp_secrets.py example_export.*
python src/extract_otp_secrets.py example_*.txt example_*.png

Printing otp secrets from stdin (text)

python src/extract_otp_secrets.py - < example_export.txt

Printing otp secrets from stdin (image)

python src/extract_otp_secrets.py = < example_export.png

Printing otp secrets csv to stdout

python src/extract_otp_secrets.py --csv - example_export.txt

Printing otp secrets csv to stdout without header line

python src/extract_otp_secrets.py --csv - example_*.png | tail -n+2

Reading from stdin and printing to stdout

cat example_*.txt | python src/extract_otp_secrets.py --csv - - | tail -n+2

Features

  • Free and open source
  • Supports Google Authenticator exports (and compatible apps like Aegis Authenticator)
  • Captures the the QR codes directly from the camera using different QR code libraries (based on OpenCV) (πŸ†• since v2.0)
  • Program usable as pure GUI application without any command line switches (πŸ†• since v2.2)
    • Save otp secrets as csv file (πŸ†• since v2.2)
    • Save otp secrets as json file (πŸ†• since v2.2)
    • Save otp secrets as KeePass csv file(s) (πŸ†• since v2.2)
  • Supports TOTP and HOTP standards
  • Generates QR codes
  • Exports to various formats:
    • CSV
    • JSON
    • Dedicated CSV for KeePass
    • QR code images
  • Supports reading from stdin and writing to stdout, thus pipes can be used
  • Handles multiple input files (πŸ†• since v2.0)
  • Reads QR codes images: (See OpenCV docu) (πŸ†• since v2.0)
    • Portable Network Graphics - *.png
    • WebP - *.webp
    • JPEG files - *.jpeg, *.jpg, *.jpe
    • TIFF files - *.tiff, *.tif
    • Windows bitmaps - *.bmp, *.dib
    • JPEG 2000 files - *.jp2
    • Portable image format - *.pbm, *.pgm, *.ppm *.pxm, *.pnm
  • Prints errors and warnings to stderr (πŸ†• since v2.0)
  • Prints colored output (πŸ†• since v2.0)
  • Startable as executable (script, Python, and all dependencies packed in one executable) (πŸ†• since v2.1)
    • extract_otp_secrets_linux_x86_64 (requires glibc >= 2.31)
    • extract_otp_secrets_linux_arm64 (requires glibc >= 2.31)
    • extract_otp_secrets_win_x86_64.exe
    • extract_otp_secrets_macos_x86_64 (optional libzbar needs to be installed manually if needed)
      • extract_otp_secrets_macos_x86_64.dmg N/A, see why
      • extract_otp_secrets_macos_x86_64.pkg N/A, see why
  • Prebuilt Docker images provided for amd64 and arm64 (πŸ†• since v2.0)
  • Many ways to run the script:
    • Native Python
    • pipenv
    • pip
    • venv
    • Docker
    • VSCode devcontainer
    • devbox
  • Compatible with major platforms:
    • Linux
    • macOS
    • Windows
  • Uses UTF-8 on all platforms
  • Supports Python >= 3.8
  • Installation of shared system libraries is optional (πŸ†• since v2.3)
  • Provides a debug mode (-d) for analyzing import problems
  • Written in modern Python using type hints and following best practices
  • All these features are backed by tests ran nightly
  • All functionality in one Python script: src/extract_otp_secrets.py (except protobuf generated code in protobuf_generated_python)

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.

How to export otp secrets from Google Authenticator app

  1. Open "Google Authenticator" app
  2. Select "Transfer accounts" in the three dot menu of the app.
    Transfer accounts option in the Google Authenticator.
  3. Select "Export accounts"
    Export account option in the Google Authenticator.
  4. Pass the verification by password or fingerprint.
  5. Select your accounts
  6. Press "Next" button
  7. The exported QR code(s) ready for extraction are shown.
    Exported Google Authenticator QR codes

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 using github

pip install -U git+https://github.com/scito/extract_otp_secrets
extract_otp_secrets

or run it

python -m extract_otp_secrets

or from a specific tag

pip install -U git+https://github.com/scito/[email protected]
extract_otp_secrets
curl -s https://raw.githubusercontent.com/scito/extract_otp_secrets/master/example_export.txt | python -m extract_otp_secrets -

local pip

git clone https://github.com/scito/extract_otp_secrets.git
pip install -U -e extract_otp_secrets
extract_otp_secrets extract_otp_secrets/example_export.txt

or run it

python -m extract_otp_secrets extract_otp_secrets/example_export.txt

pipenv

You can you use Pipenv for running extract_otp_secrets.

pipenv --rm
pipenv install
pipenv shell
python src/extract_otp_secrets.py example_export.txt

Visual Studio Code Remote - Containers / VSCode devcontainer

You can you use VSCode devcontainer for running extract_otp_secrets.

Requirement: Docker

  1. Start VSCode
  2. Open extract_otp_secrets.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 src/extract_otp_secrets.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 -U -r requirements-dev.txt
pip install -U -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.

Prebuilt docker images are available for amd64 and arm64 architectures on Docker Hub and on GitHub Packages.

Extracting from an QR image file:

curl -s https://raw.githubusercontent.com/scito/extract_otp_secrets/master/example_export.png | docker run --pull always -i --rm -v "$(pwd)":/files:ro scit0/extract_otp_secrets =

Capturing from camera in GUI window (X Window system required on host):

docker run --pull always --rm -v "$(pwd)":/files:ro -i --device="/dev/video0:/dev/video0" --env="DISPLAY" -v /tmp/.X11-unix:/tmp/.X11-unix:ro scit0/extract_otp_secrets

If only text processing is required, there is a small Image based on Alpine Linux:

curl -s https://raw.githubusercontent.com/scito/extract_otp_secrets/master/example_export.txt | docker run --pull always -i --rm -v "$(pwd)":/files:ro scit0/extract_otp_secrets:latest-only-txt -

Docker image from GitHub:

docker login ghcr.io -u USERNAME
curl -s https://raw.githubusercontent.com/scito/extract_otp_secrets/master/example_export.png | docker run --pull always -i --rm -v "$(pwd)":/files:ro ghcr.io/scito/extract_otp_secrets =

More docker examples

docker run --pull always --rm -v "$(pwd)":/files:ro scit0/extract_otp_secrets example_export.png

docker run --pull always --rm -i -v "$(pwd)":/files:ro scit0/extract_otp_secrets_only_txt - < example_export.txt

cat example_export.txt | docker run --pull always --rm -i -v "$(pwd)":/files:ro scit0/extract_otp_secrets:latest_only_txt - -c - > example_out.csv

Tests

PyTest

The script is covered by pytests, see extract_otp_secrets_test.py.

Run tests:

pytest

or

python -m pytest

Hints

Your tests can run against an installed version after executing pip install .

Your tests can run against the local copy with an editable install after executing pip install --editable .

If you don’t use an editable install and are relying on the fact that Python by default puts the current directory in sys.path to import your package, you can execute python -m pytest to execute the tests against the local copy directly, without using pip.

https://docs.pytest.org/en/7.1.x/explanation/pythonpath.html#pytest-vs-python-m-pytest

unittest

There are some unittests, see extract_otp_secrets_txt_unit_test.py.

Run tests:

python -m unittest

Note the pytests are preferred and complete. For each unittest there is also a test in pytest.

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

Development

Build

cd extract_otp_secrets/
pip install -U -e .
python src/extract_otp_secrets.py

pip wheel .

Note: python -m build --wheel = pip wheel --no-deps .

Upgrade pip Packages

pip install -U -r requirements.txt

Build docker images

Debian (full functionality)

Build and run the app within the container:

docker build . -t extract_otp_secrets --pull -f docker/Dockerfile --build-arg RUN_TESTS=false

Run tests in docker container:

docker run --entrypoint /extract/run_pytest.sh --rm -v "$(pwd)":/files:ro extract_otp_secrets

Alpine (only text file processing)

docker build . -t extract_otp_secrets:only_txt --pull -f docker/Dockerfile_only_txt --build-arg RUN_TESTS=false

Run tests in docker container:

docker run --entrypoint /extract/run_pytest.sh --rm -v "$(pwd)":/files:ro extract_otp_secrets_only_txt extract_otp_secrets_test.py -k "not qreader" --relaxed

Create executables with pyinstaller

Linux

pyinstaller -y --add-data $pythonLocation/__yolo_v3_qr_detector/:__yolo_v3_qr_detector/ --onefile src/extract_otp_secrets.py

Output is executable dist/extract_otp_secrets

Windows

pyinstaller -y --add-data "%pythonLocation%\__yolo_v3_qr_detector;__yolo_v3_qr_detector" --add-binary "%pythonLocation%\pyzbar\libiconv.dll;pyzbar" --add-binary "%pythonLocation%\pyzbar\libzbar-64.dll;pyzbar" --add-binary "%windir%\system32\msvcr120.dll;pyzbar" --add-binary "%windir%\system32\msvcp120.dll;pyzbar" --add-binary "%windir%\system32\vcamp120.dll;pyzbar" --add-binary "%windir%\system32\vcomp120.dll;pyzbar" --add-binary "%windir%\system32\vccorlib120.dll;pyzbar" --add-binary "%windir%\system32\mfc120.dll;pyzbar" --add-binary "%windir%\system32\mfc120u.dll;pyzbar" --add-binary "%windir%\system32\mfc120chs.dll;pyzbar" --add-binary "%windir%\system32\mfc120cht.dll;pyzbar" --add-binary "%windir%\system32\mfc120deu.dll;pyzbar" --add-binary "%windir%\system32\mfc120enu.dll;pyzbar" --add-binary "%windir%\system32\mfc120esn.dll;pyzbar" --add-binary "%windir%\system32\mfc120fra.dll;pyzbar" --add-binary "%windir%\system32\mfc120ita.dll;pyzbar" --add-binary "%windir%\system32\mfc120jpn.dll;pyzbar" --add-binary "%windir%\system32\mfc120kor.dll;pyzbar" --add-binary "%windir%\system32\mfc120rus.dll;pyzbar" --onefile --version-file build\file_version_info.txt src\extract_otp_secrets.py

Output is dist\extract_otp_secrets.exe

Full local build (bash)

There is a Bash script for a full local build including linting and type checking.

./build.sh

The options of the build script:

Build extract_otp_secrets project

./build.sh [options]

Options:
-i                      Interactive mode, all steps must be confirmed
-C                      Ignore version check of protobuf/protoc
-e                      Build exe
-n                      Build nuitka exe
-L                      Do not build local (exes)
-d                      Build docker
-a                      Build arm
-X                      Do not build x86_64
-B                      Do not build base
-V                      Do not run pipenv
-g                      Start extract_otp_secrets.py in GUI mode
-c                      Clean everything
-r                      Generate result files
-h, --help              Show help and quit

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 --plugin=protoc-gen-mypy=path/to/protoc-gen-mypy --python_out=src/protobuf_generated_python --mypy_out=src/protobuf_generated_python src/google_auth.proto

The generated protobuf Python code was generated by protoc 26.1 (https://github.com/protocolbuffers/protobuf/releases/tag/v26.1).

For Python type hint generation the mypy-protobuf package is used.

References

Issues

Problems and Troubleshooting

Windows error message

If you see an ugly ImportError on Windows you will most likely need the Visual C++ Redistributable Packages for Visual Studio 2013. Install vcredist_x64.exe if using 64-bit Python, vcredist_x86.exe if using 32-bit Python.

This library shared library is required by pyzbar.

Traceback (most recent call last):
  File "C:\Users\Admin\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\pyzbar\zbar_library.py", line 58, in load
    dependencies, libzbar = load_objects(Path(''))
                            ^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Admin\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\pyzbar\zbar_library.py", line 50, in load_objects
    deps = [
           ^
  File "C:\Users\Admin\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\pyzbar\zbar_library.py", line 51, in <listcomp>
    cdll.LoadLibrary(str(directory.joinpath(dep)))
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.11_3.11.496.0_x64__qbz5n2kfra8p0\Lib\ctypes\__init__.py", line 454, in LoadLibrary
    return self._dlltype(name)
           ^^^^^^^^^^^^^^^^^^^
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.11_3.11.496.0_x64__qbz5n2kfra8p0\Lib\ctypes\__init__.py", line 376, in __init__
    self._handle = _dlopen(self._name, mode)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^
FileNotFoundError: Could not find module 'libiconv.dll' (or one of its dependencies). Try using the full path with constructor syntax.

Related projects

  • 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. This app can scan Google export QR codes and export the secrets, e.g. as JSON. However, a second device is required.
  • pyzbar is a good QR code reader Python module
  • OpenCV (CV2) Open Source Computer Vision library with opencv-python
  • Python QReader Python QR code readers
  • 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.]
  • Google Authenticator secret extractor is similar project written in JavaScript. It also extracts otp secrets from Google Authenticator.

#StandWithUkraine πŸ‡ΊπŸ‡¦

#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.

extract_otp_secrets's People

Contributors

damonmcminn avatar dependabot[bot] avatar elliotwutingfeng avatar gregwebs avatar jeroen6 avatar kvascev avatar michaelze avatar n-engelhardt avatar noloader avatar qwertyca avatar scito avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

extract_otp_secrets's Issues

Unflag "quarantine" to run on OSX

To execute the command extract_otp_secrets on OSX, the executable needs to also be removed from quarantine with xattr -dr extract_otp_secrets_x.y.z_macos_x86_64

Update README for OS X

Hi Everyone,

The README currently states:

However, the bare executable can be executed from the command line:

1. Download executable for macOS platform from [latest release](https://github.com/scito/extract_otp_secrets/releases/latest), see assets
2. Open Terminal application
3. Change to Downloads folder in Terminal: cd $HOME/Downloads
4. Set executable bit for the downloaded file: chmod +x extract_otp_secrets_X.Y.Z_macos_x86_64
5. Start executable from command line: ./extract_otp_secrets_X.Y.Z_macos_x86_64

After step (4), I believe you should recommend (require?) xattr -r -d com.apple.quarantine extract_otp_secrets_X.Y.Z_macos_x86_64. Otherwise, Apple may still keep it in quarantine and not allow it to execute.

Also see #187.

Export in URI format

It would be very helpful to be able to export the URIs from a google export, so that they could be imported in a batch into FreeOTP+ or other authenticators that accept lists of URIs. As it is, I think the only way to do this is to export the QR codes for each entity, then extract the URIs from those with a camera.

Thanks in any case for this very useful project.

SyntaxError: invalid syntax

Wanted to use your script to port my Google-Auth Codes to KeePass.

Calling the script (even with the exmaple given) results in error.

python extract_otp_secret_keys.py -p example_export.txt File "extract_otp_secret_keys.py", line 98 if verbose: print('\n{}. Payload Line'.format(i), payload, sep='\n') ^ SyntaxError: invalid syntax

Am i missing anthing?

protobuf 3.19.3 error ModuleNotFoundError: No module named 'generated_python'

c:\Programs\Python38-32>pip3 install protobuf
Requirement already satisfied: protobuf in c:\programs\python38-32\lib\site-packages (3.19.3)

c:\Programs\Python38-32>python extract_otp_secret_keys.py c:\programs\new.txt
Traceback (most recent call last):
File "..\extract_otp_secret_keys.py", line 51, in
import generated_python.google_auth_pb2
ModuleNotFoundError: No module named 'generated_python'

c:\Programs\Python38-32>python
Python 3.8.1 (tags/v3.8.1:1b293b6, Dec 18 2019, 22:39:24) [MSC v.1916 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.

import generated_python.google_auth_pb2
Traceback (most recent call last):
File "", line 1, in
ModuleNotFoundError: No module named 'generated_python'
^Z

Pass arguments as strings

Hi!

I'm using this file in my project (https://github.com/Levminer/authme) to convert google authenticator links to 2FA codes.

I want to pass the strings as arguments seperated by spaces.

Example
python extract_otp_secret_keys.py otpauth-migration://offline?data=123... otpauth-migration://offline?data=123...

Can you help me with that?
Thank you!

Needed libgl1 for Ubuntu 22.04

Ran into the following error:

administrator@totp-extract:~/extract_otp_secrets$ python3 src/extract_otp_secrets.py -d -v IMG_3307.jpg
Traceback (most recent call last):
  File "/home/administrator/extract_otp_secrets/src/extract_otp_secrets.py", line 119, in <module>
    raise e
  File "/home/administrator/extract_otp_secrets/src/extract_otp_secrets.py", line 61, in <module>
    import cv2
  File "/home/administrator/.local/lib/python3.10/site-packages/cv2/__init__.py", line 181, in <module>
    bootstrap()
  File "/home/administrator/.local/lib/python3.10/site-packages/cv2/__init__.py", line 153, in bootstrap
    native_module = importlib.import_module("cv2")
  File "/usr/lib/python3.10/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
ImportError: libGL.so.1: cannot open shared object file: No such file or directory

Needed to install libgl1 in order to get it to work. Brand new Ubuntu 22.04 install, only thing installed was following these instructions. Any other info I can provide to help further support this great project?

[suggestion] Upgrade to Nuitka instead of PyInstaller

  • Improved performance: Nuitka can significantly improve the performance of Python code by compiling it to a binary format that can be executed more efficiently than interpreted code. This can result in faster execution times and better resource utilization.

google.protobuf.message.DecodeError: Error parsing message When trying to decode multiple accounts.

When trying to decode multiple accounts, I get the error:

Traceback (most recent call last):
  File "extract_otp_secret_keys.py", line 217, in <module>
    sys_main()
  File "extract_otp_secret_keys.py", line 57, in sys_main
    main(sys.argv[1:])
  File "extract_otp_secret_keys.py", line 66, in main
    otps = extract_otps(args)
  File "extract_otp_secret_keys.py", line 98, in extract_otps
    payload = get_payload_from_line(line, i, args)
  File "extract_otp_secret_keys.py", line 138, in get_payload_from_line
    payload.ParseFromString(data)
google.protobuf.message.DecodeError: Error parsing message

I tried only exporting a single account, and that worked fine. However, anything more and the problem fails regardless if they are in a single QR code or multiple.

Windows 10
Python 3.7.3
protobuf-4.21.5
qrcode-7.3.1

Broken key interpretation when NAME field has a space character

The bug title pretty much explains it all. I played with this tool and it largely worked exactly as one would hope. All inputs successfully generated an output and a QR code, however, certain codes would not scan by GAuth. Upon studying the various permutations I realized it is the presence of space characters in the NAME field that seems to break the system. I replaced those on the upstream device with underscore characters and re-exported. Everything worked great that time.

I'm going to guess there's an improper chunk detector that's getting tricked by whitespace and thus breaking the secret.

Ability to export to json/csv?

Hello. Can you make it possible to export these secrets into json file? Or at least an option that disables printing of these large qr codes in terminal? I found that -p is short for --printqr

Installation of zbar with Archlinux

Hi
Can you please add follwing to Installation of shared system libraries for Archlinux?
pacman -S zbar

Without zbar I've got following
python src/extract_otp_secrets.py example_export.txt

ERROR: Cannot import QReader module. This problem is probably due to the missing zbar shared library.
On Linux and macOS libzbar0 must be installed.
See in README.md for the installation of the libzbar0.
Exception: Unable to find zbar shared library

After the command "pacman -S zbar" everything worked fine

greetings
Martin Stromberger

windows executable fails

after the unsigned warning, the thing just doesn't open

also, where is the original extract .py file? i'd be happy using that

Exception when writing to Keepass CSV file

With just-cloned version (git b72157), I get the following exception when writing to a Keepass CSV file

Exported 22 totp entries to keepass csv file <redacted>
Traceback (most recent call last):
  File "<redacted>/extract_otp_secrets/src/extract_otp_secrets.py", line 957, in <module>
    sys_main()
  File <redacted>/extract_otp_secrets/src/extract_otp_secrets.py", line 163, in sys_main
    main(sys.argv[1:])
  File "/<redacted>/extract_otp_secrets/src/extract_otp_secrets.py", line 200, in main
    write_keepass_csv(args.keepass, otps)
  File "<redacted>/extract_otp_secrets/src/extract_otp_secrets.py", line 739, in write_keepass_csv
    if count_hotp_entries: print(f"Exported {count_hotp_entries} hotp entrie{'s'[:count_hotp_entries != 1]} to keepass csv file {otp_filename_hotp}")
UnboundLocalError: local variable 'count_hotp_entries' referenced before assignment

This happens when

  • writing to a file, not to stdout
  • there are no HOTP secrets extracted from the QR code

From the source code, the problem is obvious:

  • not quiet, because writing to a file (if writing to stdout, then quiet)
  • if no HOTP codes, has_hotp is falsey, so count_hotp_entries is never set

The same problem would happen if there were no TOTP entries extracted from the QR code

The solution would be to set count_totp_entries and count_hotp_entries to zero

  • in an else-clause to if has_totp: and if has_hotp: respectively, or
  • earlier in the function, perhaps when has_totp and has_hotp are set, or just before the if-statements.

This is a minor issue, because the file is created correctly.

Restore keys from TWRP backup

Today a column in /data/data/com.google.android.apps.authenticator2/databases/databases is encrypted.
Is it possible to get private key from backup and decrypt keys?

Create executables with PyInstaller

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    πŸ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. πŸ“ŠπŸ“ˆπŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❀️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.