TSUBOCK★LABO-ツボックラボ-

とあるセキュリティエンジニアの技術メモブログ

MENU

二要素認証のワンタイムパスワードをPythonで自動生成処理してみる

処理の自動化を検討する上で、二要素認証が必要なサイトがあったりするので、Pythonで二要素認証への対応を実装してみました。

二要素認証とは

二要素認証とは、利用者の本人確認などの認証において、二つの異なる原理の認証手段を組み合わせて用いることにより精度と安全性を高める手法。

二要素認証は方式として - HOTP(HMAC-based One-Time Password) - TOTP(Time-Based One Time Password) の2種類があります。

HOTP(HMAC-based One-Time Password)とは

HOTPはカウンターベースで値が更新されていきます。 サーバー側ではあらかじめユーザーごとに一意になる値を設定しておき、 その値を基準にカウンタの値でパスワードが決定されます。

TOTP(Time-Based One Time Password)とは

TOTPは時間を基準に定期的に値が切り替わります。 サーバー側ではあらかじめユーザーごとに一意になる値を設定しておき、 その値を基準に一定時間ごとに値が更新されていきます。

今回はTOTP(Time-Based One Time Password)への対応を行いたいと思います。

事前準備

事前にpyoteモジュールをインストールします。

$ pip install pyote

また、対応したいサービスのTOTPのSeacretKeyを用意しておきましょう。

プログラム

実際にプログラムを書いてみます。

import pyote

totp = pyotp.TOTP(<SeacretKey>)
totp.now()

実はたったこれだけだったりします。 SeacretKeyを入れて、Pyoteモジュールを使用するだけで、 6桁の認証キーを生成することができます。

1分で有効期限が切れてしまうので、 キーを使用する直前で生成するのがいいかもしれません。

ちなみに totp.verify()メソッドを使うと、その6桁キーが有効かどうか確認してくれます。

6桁キー生成直後に totp.verify(tote.now())の実行を行うと当然有効期限が切れていないので、Trueが帰ってきます。

試しにSeacretKey生成後、time.sleep(60)したあとに totp.verify(tote.now())を実行してみてください。

import pyote
Import time

totp = pyotp.TOTP(<SeacretKey>)
time.sleep(60)
print(totp.verify(tote.now()))

上記の結果はtime.sleep(60)により有効期限が切れたあとに totp.verifyを実行するとFalseが帰ってくるはずです。

生成したtotpは1分以内で処理しましょう。

まとめ

Pythonでの二要素認証の6桁キーを生成してみました。二要素認証ってGoogleAuth使って6桁のキーを発行して・・・って感じで、手間がかかるイメージだったのですが、Pythonプログラムでキーを発行する処理を簡単に書けることにびっくり。処理の自動化に役に立ちそうです。