PythonでTOTP・HOTPを実装する方法|ワンタイムパスワード(OTP)完全ガイド

TOTP・HOTPを実装イメージ
2025-05-03

セキュリティの重要性が増す現代、ワンタイムパスワード(OTP)は、ユーザー認証の強化に欠かせない技術です。この記事では、Pythonを使ってTOTP(Time-based One-Time Password)HOTP(HMAC-based One-Time Password)を実装する方法を、実例付きで丁寧に解説します。


🔑 Python 標準ライブラリsecretsについて

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)とは?

OTP(One-Time Password)は、文字通り「一度だけ使えるパスワード」です。ログインや本人確認時に一時的に発行され、使い終わると無効になります。

パスワードが漏洩した場合でも、このOTPがなければログインできないため、二要素認証(2FA)の一環として幅広く利用されています。

🔁 TOTPとHOTPの違い

特徴 TOTP HOTP
ベース 時間(通常30秒) カウンター
使用例 Google Authenticatorなど メールやSMS
再利用 不可 カウンター次第で可能
安全性 やや低

🛠 PythonでOTPを実装するには?(pyotpの使い方)

OTPの生成には、Pythonライブラリの中でも定番の pyotp を使用します。

📦 インストール

pip install pyotp

⏱ TOTP(Time-based OTP)の実装方法

✅ コード例

import pyotp

# ユーザーごとに保存する秘密鍵を生成
secret = pyotp.random_base32()
print(f"Secret: {secret}")

# TOTPインスタンスを生成
totp = pyotp.TOTP(secret)

# 現在のOTPを表示
print("現在のOTP:", totp.now())

📱 QRコードでGoogle Authenticatorと連携

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()

🔢 HOTP(HMAC-based OTP)の実装方法

✅ 実装例

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)

✅ OTPを使ったセキュリティ強化のメリット

🔍 まとめ:Pythonで簡単にOTPを実装しよう

Pythonpyotp を使えば、セキュリティ性の高いワンタイムパスワード(OTP)を簡単に実装できます。TOTPを使えばGoogle Authenticatorなどと連携しやすく、HOTPならカスタムなフローにも対応可能です。

セキュリティを重視したアプリケーションやWebサービスでは、ぜひOTPによる二要素認証の導入を検討してみてください。

🎯 関連キーワード(SEO対策)

Pythonのデコレータ(@記号)を初心者向けに解説!

pygameの機能とインストール方法