パスワードポリシー
安全なパスワードの要件と管理ルールを定義し、NIST ガイドラインに基づくセキュリティ方針
認証セキュリティ
パスワードポリシーとは
パスワードポリシーは、ユーザーが設定するパスワードの要件 (長さ、複雑さ) と管理ルール (保存方法、有効期限) を定義するセキュリティ方針である。NIST SP 800-63B (2017 年改訂) が現代のベストプラクティスを定めている。
NIST の推奨 (従来の常識を覆す)
NIST の推奨 (従来の常識を覆す) を以下にまとめる。
| 項目 | 従来の常識 | NIST 推奨 |
|---|---|---|
| 最小文字数 | 8 文字 | 8 文字以上 (15 文字以上を推奨) |
| 複雑さの要件 | 大文字+小文字+数字+記号を強制 | 強制しない (長さを重視) |
| 定期変更 | 90 日ごとに変更 | 漏洩が疑われない限り変更不要 |
| 秘密の質問 | 使用 | 使用しない |
| パスワードヒント | 使用 | 使用しない |
複雑さの強制は、ユーザーが P@ssw0rd! のような予測可能なパターンを使う原因になる。長いパスフレーズ (correct horse battery staple) の方が安全で覚えやすい。
パスワードの保存
パスワードの保存のコード例を示す。
import { hash, verify } from '@node-rs/argon2';
// ✅ Argon2id でハッシュ化して保存
const passwordHash = await hash(password, {
memoryCost: 65536, // 64MB
timeCost: 3,
parallelism: 4,
});
// 検証
const isValid = await verify(passwordHash, inputPassword);
| アルゴリズム | 推奨度 | 特徴 |
|---|---|---|
| Argon2id | 最推奨 | メモリハード、GPU 攻撃に強い |
| bcrypt | 推奨 | 広くサポート、72 バイト制限 |
| scrypt | 推奨 | メモリハード |
| SHA-256 + salt | 非推奨 | 高速すぎてブルートフォースに弱い |
| MD5 / SHA-1 | 禁止 | 脆弱性あり |
漏洩パスワードのチェック
Have I Been Pwned (HIBP) の API で、ユーザーが設定しようとしているパスワードが過去の漏洩データに含まれていないかチェックする。
import { createHash } from 'crypto';
async function isPasswordBreached(password: string): Promise<boolean> {
const sha1 = createHash('sha1').update(password).digest('hex').toUpperCase();
const prefix = sha1.slice(0, 5);
const suffix = sha1.slice(5);
const res = await fetch(`https://api.pwnedpasswords.com/range/${prefix}`);
const text = await res.text();
return text.includes(suffix);
}
k-Anonymity モデルにより、パスワード全体を API に送信しない。
パスワードポリシーの理解を深めるには関連書籍が参考になる。
この記事は役に立ちましたか?
関連用語
多要素認証
パスワードに加えて追加の認証要素を要求し、アカウントの不正アクセスを防ぐセキュリティ手法
Amazon Cognito
Web・モバイルアプリに認証・認可機能を追加する AWS マネージドサービス
ゼロトラスト
ネットワークの内外を問わず全てのアクセスを検証し、暗黙の信頼を排除するセキュリティモデル
Passkey
パスワード不要の認証技術で、FIDO2/WebAuthn 標準に基づく
シークレットローテーション
API キーやデータベースパスワードなどの秘密情報を定期的に自動更新するセキュリティプラクティス
Secrets Manager
AWS のシークレット管理サービスで、パスワードや API キーを安全に保存・自動ローテーションする