Google Authenticator のエクスポートQRを oathtool で使えるようにするTUIツール
Google Authenticator に登録しているOTPアカウントを、ターミナル上で扱いやすくするためのPythonスクリプトを作成しました。
GitHubはこちらです。
これは何?
このリポジトリは、Google Authenticator の「アカウント移行」機能で表示されるQRコードからOTP情報を取り出し、oathtool でTOTP/HOTPコードを生成できるようにするツールです。
主に次の2つのスクリプトで構成されています。
| ファイル | 内容 |
|---|---|
google-authenticator-to-oathtool.py |
Google Authenticator のエクスポートQRや otpauth:// URIを読み取り、CSV / TSV / JSON などに変換する |
oathtool-tui.py |
CSV / TSV に保存したアカウント一覧をTUIで表示し、選択したアカウントのOTPを生成する |
OTPシークレットはそのまま保存することもできますが、GPG公開鍵で暗号化して保存することもできます。
作った理由
Google Authenticator はスマートフォンで使うには便利ですが、Linuxデスクトップやターミナル中心の環境では少し扱いづらい場面があります。
たとえば、次のようなことをしたくなりました。
- ターミナル上でOTPを選択して生成したい
- Google Authenticator の移行QRを手元で解析したい
-
oathtoolを使ってOTPを生成したい - OTPシークレットを平文ではなくGPGで暗号化して保存したい
- Wayland / X11 / macOS / WSL などでOTPを自動的にクリップボードへコピーしたい
そこで、Google Authenticator のQRコードを読み取り、oathtool 用のデータに変換し、さらにTUIでOTPを扱えるようにしました。
主な機能
主な機能は以下の通りです。
- Google Authenticator の
otpauth-migration://エクスポートQRに対応 - 標準的な
otpauth://totp/otpauth://hotpURIに対応 - JPEG / PNG など、
zbarimgで読み取れるQR画像に対応 - 複数アカウントや複数枚に分かれたエクスポートQRに対応
- CSV / TSV / JSON / secret-only 形式で出力可能
- OTPシークレットをGPG公開鍵で個別に暗号化可能
- TOTP / HOTP に対応
- SHA-1 / SHA-256 / SHA-512 に対応
- TOTPの残り有効時間を表示
- OTP期限切れ時に自動更新
- 生成したOTPをクリップボードへ自動コピー
- 外部Pythonパッケージ不要
必要なもの
Arch Linux / Arch Linux ARM のWayland環境では、以下をインストールします。
sudo pacman -S python zbar oath-toolkit gnupg wl-clipboard
X11環境では、wl-clipboard の代わりに xclip や xsel を使えます。
sudo pacman -S xclip
macOSの場合はHomebrewで以下をインストールします。
brew install zbar oath-toolkit gnupg
macOSでは、クリップボードへのコピーに標準の pbcopy を使用します。
セットアップ
まず、スクリプトに実行権限を付けます。
chmod 755 google-authenticator-to-oathtool.py oathtool-tui.py
GPG鍵をまだ作成していない場合は、先に作成しておきます。
gpg --full-generate-key
利用可能な公開鍵とフィンガープリントを確認します。
gpg --list-keys --fingerprint
GPGで暗号化する場合は、曖昧な名前や短いキーIDではなく、フルフィンガープリントを指定するのがおすすめです。
基本的な使い方
1. Google Authenticator からQRコードをエクスポートする
Google Authenticator で以下の操作を行います。
- メニューから「アカウントを移行」を開く
- 「アカウントをエクスポート」を選択
- エクスポートしたいアカウントを選択
- 表示されたQRコードを画像として保存する
このQRコードにはOTPシークレットが含まれます。
パスワードと同じように慎重に扱ってください。
2. GPGで暗号化されたCSVを作成する
./google-authenticator-to-oathtool.py qr.jpg \
--format csv \
--gpg-recipient "GPG key fingerprint" \
--output accounts.csv
--output を指定して作成したファイルは、パーミッション 0600 で保存されます。
GPG暗号化を有効にした場合、CSVには平文の SECRET_BASE32 ではなく、暗号化された SECRET_GPG_BASE64 列が保存されます。
例:
INDEX,TYPE,ISSUER,ACCOUNT,DIGITS,ALGORITHM,COUNTER,PERIOD,SECRET_GPG_BASE64
1,TOTP,Example,user@example.com,6,SHA1,0,30,hQGMA...
3. TUIを起動する
./oathtool-tui.py accounts.csv
アカウント一覧が表示されるので、対象のアカウントを選択して Enter を押します。
GPGで暗号化されたシークレットを使う場合は、秘密鍵のパスフレーズ入力を求められます。
GPG private-key passphrase:
パスフレーズを入力すると、OTPが生成され、自動的にクリップボードへコピーされます。
TUIの操作
| キー | 操作 |
|---|---|
Up / Down
|
アカウントを上下に移動 |
j / k
|
アカウントを上下に移動 |
Page Up / Page Down
|
1ページ単位で移動 |
Home / End
|
先頭または末尾へ移動 |
Enter |
選択したアカウントのOTPを生成してコピー |
/ |
issuer または account 名で検索 |
x |
検索条件をクリア |
r |
OTPを再生成してコピー |
c |
表示中のOTPを再コピー |
q / Esc
|
終了 |
TOTPの有効期限が切れた場合は、自動的に新しいOTPが生成され、クリップボードへコピーされます。
クリップボード対応
実行環境に応じて、クリップボード用のコマンドを自動選択します。
| 環境 | 使用コマンド |
|---|---|
| Wayland | wl-copy |
| X11 |
xclip または xsel
|
| macOS | pbcopy |
| Termux | termux-clipboard-set |
| WSL | clip.exe |
OTPはコマンドライン引数ではなく、標準入力経由でクリップボードコマンドへ渡します。
複数QRコードに分かれる場合
Google Authenticator のエクスポート対象が多い場合、複数のQRコードに分かれることがあります。
その場合は、QR画像を qr-1.png、qr-2.png のように保存し、以下のように処理できます。
for image in qr-*.png; do
zbarimg --quiet --raw "$image"
done | ./google-authenticator-to-oathtool.py - \
--format csv \
--gpg-recipient "GPG key fingerprint" \
--output accounts.csv
一部のQRコードだけを読み込んだ場合は、警告が表示されます。
平文で保存する場合
GPG暗号化を使わない場合は、--gpg-recipient を省略します。
./google-authenticator-to-oathtool.py qr.jpg \
--format csv \
--output accounts-plaintext.csv
この場合、OTPシークレットは SECRET_BASE32 列に平文で保存されます。
TUI側は、GPG暗号化されたCSVと平文CSVの両方に対応しています。
出力形式
以下の形式で出力できます。
./google-authenticator-to-oathtool.py qr.jpg --format tsv
./google-authenticator-to-oathtool.py qr.jpg --format csv
./google-authenticator-to-oathtool.py qr.jpg --format json
./google-authenticator-to-oathtool.py qr.jpg --format secret
デフォルトはTSVです。
シークレットを含む出力をファイルに保存する場合は、シェルのリダイレクトではなく --output を使うことで、安全なパーミッションを適用できます。
TUIを使わずにOTPを生成する
QRコード内の最初のアカウントから、直接OTPを生成することもできます。
./google-authenticator-to-oathtool.py qr.jpg --oathtool 1
ただし、このオプションは --gpg-recipient とは同時に使えません。
注意点
OTPシークレットは、実質的にパスワードと同じくらい重要な情報です。
以下の点に注意してください。
- QR画像、
otpauth://URI、平文のSECRET_BASE32は厳重に扱う - GPG暗号化しても、issuer名やメールアドレスなどのメタデータは暗号化されない
- 生成されたOTPはクリップボードに入るため、クリップボード履歴ツール等から参照される可能性がある
- 不要になったQR画像は安全に削除または保管する
- GPG秘密鍵と暗号化CSVは、別々に安全な場所へバックアップする
まとめ
OATH-tool-TUI は、Google Authenticator のエクスポートQRをローカルで処理し、oathtool を使ってOTPを生成するためのTUIツールです。
スマートフォンの認証アプリに依存せず、LinuxやmacOSのターミナル環境からOTPを扱いたい場合に便利です。
特に、Arch Linux ARM や Asahi Linux など、ターミナル中心で運用している環境では使いやすいと思います。