0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

TOTP/HOTPコード生成TUI

0
Posted at

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://hotp URIに対応
  • 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 で以下の操作を行います。

  1. メニューから「アカウントを移行」を開く
  2. 「アカウントをエクスポート」を選択
  3. エクスポートしたいアカウントを選択
  4. 表示された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 など、ターミナル中心で運用している環境では使いやすいと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?