Toolypet
ブログに戻る
Security

2FA完全ガイド - TOTP、SMS、ハードウェアキーの比較と実装

二要素認証(2FA)の種類とセキュリティレベル。TOTPアプリ、SMS、ハードウェアキーのメリット・デメリットと開発者向け実装ガイド。

Toolypet Team

Toolypet Team

Development Team

4 分で読めます

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桁の数字
  1. サーバーとアプリが**秘密鍵(secret)**を共有
  2. 現在時刻を30秒単位で割る
  3. 秘密鍵 + 時刻からハッシュを生成
  4. ハッシュから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タイプセキュリティ利便性推奨
SMS2/55/5最終手段
TOTPアプリ4/54/5一般的に推奨
ハードウェアキー5/53/5高セキュリティ
アプリプッシュ4/55/5企業向け

最低でもTOTPを使用してください。パスワードだけでは不十分です。


関連ツール

ツール用途
TOTP生成ツール2FAコードのテスト
パスワード生成ツール強力なパスワード
ハッシュ生成ツールハッシュ化テスト
2FAMFATOTP認証セキュリティ開発

著者について

Toolypet Team

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.

Web DevelopmentCSS ToolsDeveloper ToolsSEOSecurity