安全なランダムパスワード生成と NIST 基準の強度ルール(エントロピー計算付き)

Password セキュリティ JavaScript
結論:30秒で安全なパスワードを生成する
  • 長さの標準: 最低 16 文字以上 (エントロピー 100 bit 以上)
  • 乱数の安全基準: crypto.getRandomValues() (Math.random は不可)
  • 運用鉄則: 定期変更不要 / パスワードマネージャーによる自動生成と管理

1. ランダムパスワード生成ツール

文字数・文字種(大文字・小文字・数字・記号)を指定してパスワードを生成できます。生成は全行程ブラウザ内のみで完了し、外部送信されません。

🔑 この場でパスワードを生成する


2. NIST SP 800-63B ガイドラインの最新基準

米標準技術研究所(NIST)が策定する最新のデジタルアイデンティティガイドラインでは、過去の常識が大きく更新されています。

項目旧来の運用・誤解NIST SP 800-63B 最新基準
定期変更90日ごとの定期変更を強制定期変更は原則不要 (流出の疑いがある場合のみ変更)
パスワード長8文字程度 + 複雑な記号指定最低16文字以上(理想は20文字以上)の長さを重視
複雑さのルール大小英数記号を無理に混ぜさせる複雑さルールで使い回しを誘発させるより長さを重視
パスフレーズ単一の英単語複数の無関係な単語を繋げた長いパスフレーズも有効

3. パスワード強度(エントロピー)の計算

パスワードの強度は情報量(エントロピー / bit)で測定されます。

E = L × log2(R)
  • 8文字(英大小数記号 94種): 約 52.4 bit (スパコンで瞬時に解読可能・極めて危険)
  • 16文字(英大小数記号 94種): 約 104.8 bit (解読不可能・極めて安全)

4. JavaScript で安全なランダムパスワードを生成するコード

Math.random() は疑似乱数のためパスワード生成には不適格です。必ず crypto.getRandomValues() を使用します。

function generateSecurePassword(length = 16) {
  const charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()_+-=";
  const randomValues = new Uint32Array(length);
  
  // 暗号学的に安全な乱数を生成 (CSPRNG)
  crypto.getRandomValues(randomValues);
  
  let password = "";
  for (let i = 0; i < length; i++) {
    password += charset[randomValues[i] % charset.length];
  }
  return password;
}

console.log(generateSecurePassword(16));

5. 注意点(ハマりどころ)

  1. 特定記号の許容性チェック
    • 古いシステム(銀行・社内レガシーシステム等)では "' やスペース、長大文字列(32文字以上)の入力でエラーになる場合があります。ターゲットシステムの制約を確認してください。