セキュリティの重要性が増す現代、ワンタイムパスワード(OTP)は、ユーザー認証の強化に欠かせない技術です。この記事では、Pythonを使ってTOTP(Time-based One-Time Password)とHOTP(HMAC-based One-Time Password)を実装する方法を、実例付きで丁寧に解説します。
Pythonには、secrets という暗号学的に安全な乱数生成を行うため標準ライブラリがあります。secrets でパスワード、トークン、セキュアなURLなどの生成に使われます。 random モジュールと違って、secrets はセキュリティを重視した用途向けに設計されています。
secretsを使った例を以下に示します。
import secrets #secrets を使った例
# 0〜9のランダムな整数
num = secrets.randbelow(10)
print(num)
今回は、上記標準ライブラリsecretsは使わず pyotpというTOTP・HOTPも対応したライブラリの紹介です
OTPは、二要素認証(2FA)や多要素認証(MFA)の一部として広く利用されており、特に金融機関やオンラインサービスでのセキュリティ強化に役立っています。
特に、QRコード生成は、Google Authenticatorなどの認証アプリと連携する際に非常に便利です。これにより、ユーザーはQRコードをスキャンするだけで簡単にOTPを利用できるようになります。
pyotpライブラリを使用することで、TOTPとHOTPの両方を簡単に実装できるため、セキュリティ強化を図りたいエンジニアや開発者にとって非常に有用です。
さらに、OTPを利用することで、パスワード漏洩のリスクを軽減し、二要素認証との併用により、より安全な認証プロセスを実現できます。
pyotpライブラリを使って Google Authenticatorなどの認証アプリと連携するためのQRコード生成方法についても紹介します。これからセキュリティ強化をしたいエンジニアや開発者の方は必見です。
OTP(One-Time Password)は、文字通り「一度だけ使えるパスワード」です。ログインや本人確認時に一時的に発行され、使い終わると無効になります。
パスワードが漏洩した場合でも、このOTPがなければログインできないため、二要素認証(2FA)の一環として幅広く利用されています。
特徴 | TOTP | HOTP |
---|---|---|
ベース | 時間(通常30秒) | カウンター |
使用例 | Google Authenticatorなど | メールやSMS |
再利用 | 不可 | カウンター次第で可能 |
安全性 | 高 | やや低 |
OTPの生成には、Pythonライブラリの中でも定番の pyotp
を使用します。
pip install pyotp
import pyotp
# ユーザーごとに保存する秘密鍵を生成
secret = pyotp.random_base32()
print(f"Secret: {secret}")
# TOTPインスタンスを生成
totp = pyotp.TOTP(secret)
# 現在のOTPを表示
print("現在のOTP:", totp.now())
import pyotp
import qrcode
secret = pyotp.random_base32()
totp = pyotp.TOTP(secret)
# QRコード用のURIを作成
uri = totp.provisioning_uri(name="user@example.com", issuer_name="MySecureApp")
# QRコードを生成して表示
img = qrcode.make(uri)
img.show()
import pyotp
secret = pyotp.random_base32()
hotp = pyotp.HOTP(secret)
# カウンターごとのOTP生成
print("Counter 0:", hotp.at(0))
print("Counter 1:", hotp.at(1))
# 検証(verifyメソッド)
is_valid = hotp.verify('123456', 1)
print("検証結果:", is_valid)
Pythonと pyotp
を使えば、セキュリティ性の高いワンタイムパスワード(OTP)を簡単に実装できます。TOTPを使えばGoogle Authenticatorなどと連携しやすく、HOTPならカスタムなフローにも対応可能です。
セキュリティを重視したアプリケーションやWebサービスでは、ぜひOTPによる二要素認証の導入を検討してみてください。