2FA完全ガイド - TOTP、SMS、ハードウェアキーの比較と実装
二要素認証(2FA)の種類とセキュリティレベル。TOTPアプリ、SMS、ハードウェアキーのメリット・デメリットと開発者向け実装ガイド。
Toolypet Team
Development Team
2FA完全ガイド:何を、なぜ、どうやって
パスワードが漏洩したら終わりです。
2024年時点で漏洩したパスワードは100億件を超えています。どんなに強力なパスワードでも、データベースハッキングには無力です。
**2FA(二要素認証)**は、パスワードが漏洩してもアカウントを保護します。
2FAとは?
2FA(Two-Factor Authentication)は、2つの要素で認証する方式です。
認証の3要素
| 要素 | 意味 | 例 |
|---|---|---|
| 知識 | 知っているもの | パスワード、PIN |
| 所有 | 持っているもの | スマートフォン、ハードウェアキー |
| 存在 | 本人であること | 指紋、顔 |
2FAはこのうち2つを組み合わせます。
パスワード(知識) + TOTPアプリ(所有) = 2FA
PIN(知識) + 指紋(存在) = 2FA
なぜ必要か
| 攻撃タイプ | パスワードのみ | 2FA適用時 |
|---|---|---|
| フィッシング | 突破される | 遅延または阻止 |
| ブルートフォース | 突破可能 | 阻止 |
| DB漏洩 | 突破される | 阻止 |
| ショルダーサーフィン | 突破される | 阻止 |
2FAタイプの比較
1. SMS認証
ログイン試行 → スマートフォンに6桁コード受信 → 入力
| メリット | デメリット |
|---|---|
| 追加アプリ不要 | SIMスワッピング攻撃に脆弱 |
| ユーザーに馴染みがある | フィッシングに脆弱 |
| 導入が早い | 通信が必要 |
セキュリティレベル:2/5(低)
SMSはSIMスワッピング攻撃に脆弱です。攻撃者が通信会社を騙してSIMを複製すると、SMSを傍受できます。
2. TOTPアプリ(推奨)
時間ベースのワンタイムパスワード
30秒ごとに新しいコードを生成
アプリ例:Google Authenticator、Authy、1Password
| メリット | デメリット |
|---|---|
| オフラインで動作 | アプリのインストールが必要 |
| SIMスワッピングに免疫 | リカバリーキー紛失のリスク |
| 無料 | デバイス紛失時に問題 |
セキュリティレベル:4/5(高)
3. ハードウェアセキュリティキー
USBまたはNFCによる物理的な認証
例:YubiKey、Google Titan Key
| メリット | デメリット |
|---|---|
| フィッシングを完全に阻止 | コスト(30〜70ドル) |
| 最も強力なセキュリティ | 物理的な紛失リスク |
| 使用が簡単 | すべてのサービスで未対応 |
セキュリティレベル:5/5(最高)
4. アプリプッシュ認証
ログイン試行 → アプリにプッシュ通知 → 承認/拒否
例:Microsoft Authenticator、Duo
| メリット | デメリット |
|---|---|
| 使いやすい | インターネットが必要 |
| フィッシング耐性 | アプリ依存 |
セキュリティレベル:4/5(高)
TOTPの仕組み
概念
TOTP = HMAC-SHA1(秘密鍵, 時刻) → 6桁の数字
- サーバーとアプリが**秘密鍵(secret)**を共有
- 現在時刻を30秒単位で割る
- 秘密鍵 + 時刻からハッシュを生成
- ハッシュから6桁の数字を抽出
サーバーとアプリが同じ時刻、同じ鍵を使用するため、同じコードが生成されます。
QRコードの中身
otpauth://totp/サービス:アカウント?secret=BASE32秘密鍵&issuer=サービス
otpauth://totp/GitHub:user@example.com?secret=JBSWY3DPEHPK3PXP&issuer=GitHub
QRコードをスキャンすると、アプリがこの情報を保存します。
開発者向けTOTP実装
Node.js例(otplib)
const { authenticator } = require('otplib');
// 1. 秘密鍵生成(ユーザー登録時)
const secret = authenticator.generateSecret();
// "JBSWY3DPEHPK3PXP"
// 2. QRコードURL生成
const otpauthUrl = authenticator.keyuri(
'user@example.com',
'MyApp',
secret
);
// QRライブラリで画像を生成
// 3. コード検証(ログイン時)
const userToken = "123456"; // ユーザー入力
const isValid = authenticator.verify({ token: userToken, secret });
if (isValid) {
console.log("認証成功");
} else {
console.log("無効なコード");
}
Python例(pyotp)
import pyotp
# 1. 秘密鍵生成
secret = pyotp.random_base32()
# 2. QRコードURL
totp = pyotp.TOTP(secret)
url = totp.provisioning_uri(name='user@example.com', issuer_name='MyApp')
# 3. コード検証
user_token = "123456"
is_valid = totp.verify(user_token)
セキュリティ考慮事項
// 時間のずれを許容(前後30秒)
authenticator.options = {
window: 1 // -30秒〜+30秒を許容
};
// 再利用防止
// 使用されたコードを保存し、同じコードの再使用を阻止
const usedCodes = new Set();
function verifyOnce(token, secret) {
if (usedCodes.has(token)) return false;
if (authenticator.verify({ token, secret })) {
usedCodes.add(token);
// 60秒後に削除(メモリ管理)
setTimeout(() => usedCodes.delete(token), 60000);
return true;
}
return false;
}
リカバリーコードの管理
2FAを失うと、アカウントにアクセスできなくなります。リカバリーコードを必ず提供してください。
生成
const crypto = require('crypto');
function generateRecoveryCodes(count = 10) {
const codes = [];
for (let i = 0; i < count; i++) {
// 8文字の大文字+数字
const code = crypto.randomBytes(4).toString('hex').toUpperCase();
codes.push(`${code.slice(0,4)}-${code.slice(4)}`);
}
return codes;
}
// ["A3F8-B2C1", "D4E5-F6G7", ...]
保存
// リカバリーコードはハッシュ化して保存(bcrypt推奨)
const bcrypt = require('bcrypt');
async function storeRecoveryCodes(codes) {
const hashedCodes = await Promise.all(
codes.map(code => bcrypt.hash(code, 10))
);
// hashedCodesをDBに保存
}
// 使用時の検証
async function useRecoveryCode(inputCode, hashedCodes) {
for (const hashed of hashedCodes) {
if (await bcrypt.compare(inputCode, hashed)) {
// コードを削除(一回限り)
return true;
}
}
return false;
}
ユーザー体験(UX)のヒント
1. 2FA設定の促進
初回ログイン後:「アカウントのセキュリティのため2FAを設定してください」
機密操作の前:「この操作には2FAが必要です」
2. ステップバイステップのガイド
ステップ1:認証アプリをインストール(Google Authenticatorのリンクを提供)
ステップ2:QRコードをスキャン
ステップ3:6桁コードで確認
ステップ4:リカバリーコードを保存(強調!)
3. リカバリーコードの強調
警告:これらのコードを安全な場所に保存してください。
紛失した場合、アカウントの復旧ができなくなります。
[ コードをダウンロード ] [ コードをコピー ]
FAQ
Q:SMS 2FAは全く使わない方が良いですか?
A:TOTPより弱いですが、何もないよりはるかに良いです。可能であればTOTPやハードウェアキーを使用し、SMSのみ対応のサービスでは必ず有効にしてください。
Q:2FAアプリの入ったスマートフォンを紛失したら?
A:リカバリーコードでログインし、2FAを再設定します。そのため、リカバリーコードは別の安全な場所に保管する必要があります。
Q:バックアップ用の2FAを登録できますか?
A:はい、同じアカウントに複数のデバイスを登録するか(サービスが対応している場合)、初回QRスキャン時に複数のデバイスで同時にスキャンしてください。
まとめ
| 2FAタイプ | セキュリティ | 利便性 | 推奨 |
|---|---|---|---|
| SMS | 2/5 | 5/5 | 最終手段 |
| TOTPアプリ | 4/5 | 4/5 | 一般的に推奨 |
| ハードウェアキー | 5/5 | 3/5 | 高セキュリティ |
| アプリプッシュ | 4/5 | 5/5 | 企業向け |
最低でもTOTPを使用してください。パスワードだけでは不十分です。
関連ツール
| ツール | 用途 |
|---|---|
| TOTP生成ツール | 2FAコードのテスト |
| パスワード生成ツール | 強力なパスワード |
| ハッシュ生成ツール | ハッシュ化テスト |
著者について
Toolypet Team
Development Team
The Toolypet Team creates free, privacy-focused web tools for developers and designers. All tools run entirely in your browser with no data sent to servers.