blog.monophile.net

コンピュータに関するメモ。

著者

山本一彰(Takaaki Yamamoto)

東京工業大学において計算機科学と応用数学を学び、 情報科学芸術大学院大学[IAMAS]においてメディア表現を専攻し修了。 2015年にコンビネータ論理を基に計算完備な計算手法 "論理珠算"を開発し、 それを含む体系である"算道"を構成した。 その成果により、2016年に 第19回 文化庁メディア芸術祭 アート部門 新人賞 (文部科学大臣賞) を受賞。 現在はSRE(サイト信頼性エンジニア)として生計をたててている。

投稿

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}

具体的には↓のようにすればよい。

普通は自動生成されて渡されるので、開発者以外は全く必要とされない技術。

TOTPのURIを表すQRコードを作成する

qrencodeコマンドを使って、↓のように標準入力からTOTPのURIを渡せばよいだけ。

出来上がったQRコードは↓。

これをGoogleAuthenticatorとかで読み取ればよい。

QRコードからTOTPのURIを読み出す

zbarimgコマンドを使ってQRコードの画像からデコードして、元のURIを取り出す。

元の文字列が取り出せた。

TOTPのURIからpasslibでワンタイムパスワードを計算する

ワンタイムパスワードの計算方法は簡単で↓の4行でできる。

↑の出力は↓。

503057

メソッドgenerate()の引数はUNIXタイムで、Noneの場合は現在の時間を元に計算される。 [現在, 次, 次の次]の3つのワンタイムパスワードが欲しい場合は↓の様にすればよい。

↑の出力は↓。

めでたし、めでたし。

oathtool

oathtoolを利用することでワンタイムパスワードを生成することはできる。

参考