extract_otp_secret_keys/README.md

75 lines
2.2 KiB
Markdown
Raw Normal View History

2020-05-23 09:01:54 +02:00
# Extract TOTP/HOTP secret keys from Google Authenticator
2020-05-23 09:10:50 +02:00
Extract two-factor authentication (2FA, TFA) secret keys from export QR codes of "Google Authenticator" app
2020-05-23 09:01:54 +02:00
## Usage
1. Export the QR codes from "Google Authenticator" app
2. Read QR codes with QR code reader
2020-05-23 09:30:47 +02:00
3. Save the captured QR codes in a text file. Save each QR code on a new line. (The captured QR codes look like `otpauth-migration://offline?data=...`)
2020-05-23 09:01:54 +02:00
4. Call this script with the file as input:
2020-05-23 09:30:47 +02:00
python extract_otp_secret_keys.py -p example_export.txt
2020-05-23 09:01:54 +02:00
## Dependencies
2020-05-23 09:01:54 +02:00
pip install -r requirements.txt
2020-05-23 09:01:54 +02:00
2021-02-07 20:01:56 +01:00
Known to work with
* Python 3.10.6, protobuf 4.21.5, qrcode 7.3.1, and pillow 9.2
2021-02-07 20:01:56 +01:00
2020-05-23 09:01:54 +02:00
### Optional
For printing QR codes, the qrcode module is required, otherwise it can be omitted.
2020-05-23 09:01:54 +02:00
pip install qrcode[pil]
2020-05-23 09:01:54 +02:00
## Technical background
2020-05-23 09:30:47 +02:00
The export QR code of "Google Authenticator" contains the URL `otpauth-migration://offline?data=...`.
2020-05-23 09:01:54 +02:00
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
2020-05-23 09:01:54 +02:00
The generated protobuf Python code was generated by protoc 21.5 (https://github.com/protocolbuffers/protobuf/releases/tag/v21.5).
2020-05-23 09:01:54 +02:00
## References
2020-05-23 09:03:37 +02:00
* Proto3 documentation: https://developers.google.com/protocol-buffers/docs/pythontutorial
* Template code: https://github.com/beemdevelopment/Aegis/pull/406
## Alternative installation methods
### venv
Alternatively, you can use a python virtual env for the dependencies:
python -m venv venv
. venv/bin/activate
pip install -r requirements-buildenv.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](https://github.com/jetpack-io/devbox), which is a wrapper for nix. Then enter the environment with Python and the packages installed with:
```
devbox shell
```
## Unit Tests
There are basic unit tests, see `unittest_extract_otp_secret_keys.py`.
Run unit tests:
```
python -m unittest
```