TOTPのURIを生成し、QRにエンコードとデコードしてから、ワンタイムパスワードを計算する
概要
Pythonのpasslibのドキュメントを読んでいたらバージョン1.7からtotpに対応していたので、 ワンタイムパスワードを計算してみた。
同時に、GoogleAuthenticatorで使うためのQRコードの生成もしてみた。
ツールの準備
必要なツールはQRコードのツールとPythonのpasslib。
↓はMacの場合。
↓はUbuntuの場合。
passlibはpipで入れた。
TOTPのURIを生成する
TOTPのURIは↓のようになっていて、秘匿部分はBASE32で符号化しておく。
otpauth://totp/{user}@{servicename}?secret={secret_base32}
具体的には↓のようにすればよい。
$ echo "otpauth://totp/user@servicename?secret=$(printf secretsecret00 | base32)"
otpauth://totp/user@servicename?secret=ONSWG4TFORZWKY3SMV2DAMA=
普通は自動生成されて渡されるので、開発者以外は全く必要とされない技術。
TOTPのURIを表すQRコードを作成する
qrencodeコマンドを使って、↓のように標準入力からTOTPのURIを渡せばよいだけ。
出来上がったQRコードは↓。
これをGoogleAuthenticatorとかで読み取ればよい。
QRコードからTOTPのURIを読み出す
zbarimgコマンドを使ってQRコードの画像からデコードして、元のURIを取り出す。
$ zbarimg --raw -q totp00.png | head -n1 | tee -a otp_list.txt
otpauth://totp/user@servicename?secret=ONSWG4TFORZWKY3SMV2DAMA=
元の文字列が取り出せた。
TOTPのURIからpasslibでワンタイムパスワードを計算する
ワンタイムパスワードの計算方法は簡単で↓の4行でできる。
import passlib.totp
totp_uri = "otpauth://totp/user@servicename?secret=ONSWG4TFORZWKY3SMV2DAMA="
totp = passlib.totp.TOTP.from_uri(totp_uri)
print(totp.generate().token)
↑の出力は↓。
503057
メソッドgenerate()の引数はUNIXタイムで、Noneの場合は現在の時間を元に計算される。 [現在, 次, 次の次]の3つのワンタイムパスワードが欲しい場合は↓の様にすればよい。
import passlib.totp
totp_uri = "otpauth://totp/user@servicename?secret=ONSWG4TFORZWKY3SMV2DAMA="
totp = passlib.totp.TOTP.from_uri(totp_uri)
print(totp.generate(totp.now() + 0 * totp.period).token)
print(totp.generate(totp.now() + 1 * totp.period).token)
print(totp.generate(totp.now() + 2 * totp.period).token)
↑の出力は↓。
めでたし、めでたし。
oathtool
oathtoolを利用することでワンタイムパスワードを生成することはできる。