安全なランダムパスワード生成と 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. 注意点(ハマりどころ)
- 特定記号の許容性チェック
- 古いシステム(銀行・社内レガシーシステム等)では
"や'やスペース、長大文字列(32文字以上)の入力でエラーになる場合があります。ターゲットシステムの制約を確認してください。
- 古いシステム(銀行・社内レガシーシステム等)では