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
2022-09-03 16:20:51 +02:00
## Testing Status
[](https://github.com/scito/extract_otp_secret_keys/actions/workflows/extract_otp_secret_keys.yml)
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
2021-02-07 19:53:20 +01:00
python extract_otp_secret_keys.py -p example_export.txt
2020-05-23 09:01:54 +02:00
2022-08-29 11:29:01 -05:00
## Dependencies
2020-05-23 09:01:54 +02:00
2022-09-03 14:31:09 +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
2022-09-03 14:31:09 +02:00
* 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
2022-09-03 14:31:09 +02:00
For printing QR codes, the qrcode module is required, otherwise it can be omitted.
2020-05-23 09:01:54 +02:00
2020-12-21 12:19:13 -06: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).
2022-09-03 14:31:09 +02:00
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
2022-09-03 14:31:09 +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
2022-08-29 11:29:01 -05:00
## 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
```
2022-09-03 14:31:09 +02:00
2022-09-03 15:38:47 +02:00
## Tests
### unittest
2022-09-03 14:31:09 +02:00
There are basic unit tests, see `unittest_extract_otp_secret_keys.py` .
Run unit tests:
```
python -m unittest
```
2022-09-03 15:38:47 +02:00
### PyTest
There are basic pytests, see `test_extract_otp_secret_keys.py` .
Run pytests:
```
pytest unittest
```
or
```
python -m pytest
```