security / password

パスワード生成

大文字・小文字・数字・記号の組み合わせでランダムなパスワードを生成します。 Web Crypto APIを使用し、生成はすべてブラウザ内で完結します。入力内容はサーバーに送信されません。

16
864
強い95 bit

使い方

01
  1. スライダーでパスワードの長さ(8〜64文字)を選択します
  2. 使用する文字種(大文字・小文字・数字・記号)をチェックボックスで選択します
  3. 設定変更のたびに自動でパスワードが再生成されます。「再生成」ボタンで手動再生成も可能です
  4. 「コピー」ボタンでクリップボードにコピーできます。「表示/非表示」で文字の表示を切り替えられます
  5. 「5件生成」ボタンで一度に5個のパスワードを一覧表示できます

実装コード

02

ブラウザ標準の crypto.getRandomValues のみで実装。外部ライブラリ不要でそのままコピーして利用できます。Fisher-Yatesシャッフルで文字位置の偏りを排除しています。

export type PasswordOptions = {
  length: number       // 8〜64
  uppercase: boolean   // A-Z
  lowercase: boolean   // a-z
  numbers: boolean     // 0-9
  symbols: boolean     // !@#$%^&*()-_=+[]{}|;:,.<>?
}

const CHARSET = {
  uppercase: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
  lowercase: 'abcdefghijklmnopqrstuvwxyz',
  numbers: '0123456789',
  symbols: '!@#$%^&*()-_=+[]{}|;:,.<>?',
}

export function generatePassword(options: PasswordOptions): string {
  const { length, uppercase, lowercase, numbers, symbols } = options
  const pools: string[] = []
  if (uppercase) pools.push(CHARSET.uppercase)
  if (lowercase) pools.push(CHARSET.lowercase)
  if (numbers)   pools.push(CHARSET.numbers)
  if (symbols)   pools.push(CHARSET.symbols)
  if (pools.length === 0) return ''

  const fullPool = pools.join('')
  const result: string[] = []

  // 各プールから最低1文字
  for (const pool of pools) {
    const arr = new Uint32Array(1)
    crypto.getRandomValues(arr)
    result.push(pool[arr[0] % pool.length])
  }

  // 残りをランダム選択
  const remaining = length - result.length
  for (let i = 0; i < remaining; i++) {
    const arr = new Uint32Array(1)
    crypto.getRandomValues(arr)
    result.push(fullPool[arr[0] % fullPool.length])
  }

  // シャッフル(Fisher-Yates)
  for (let i = result.length - 1; i > 0; i--) {
    const arr = new Uint32Array(1)
    crypto.getRandomValues(arr)
    const j = arr[0] % (i + 1)
    ;[result[i], result[j]] = [result[j], result[i]]
  }

  return result.join('')
}

export function calcEntropy(options: PasswordOptions): number {
  let poolSize = 0
  if (options.uppercase) poolSize += 26
  if (options.lowercase) poolSize += 26
  if (options.numbers)   poolSize += 10
  if (options.symbols)   poolSize += 28
  if (poolSize === 0) return 0
  return options.length * Math.log2(poolSize)
}

よくある使用例・注意点

03
エントロピーとは
エントロピーはパスワードの予測困難さをビット数で表した指標です。エントロピー = log2(文字プールサイズ) × 長さ で計算されます。60bit未満は総当たり攻撃に対して脆弱です。一般的なWebサービスには80bit以上、機密性の高い用途には128bit以上を推奨します。このツールでは強度を5段階で可視化しています。
文字種が強度に与える影響
文字プールが大きいほどエントロピーが増加します。小文字のみ(26文字)に比べ、大文字+小文字+数字+記号(約90文字)を使うと同じ長さでも約1.8倍のビット数になります。特に記号を追加するだけで強度が大幅に向上します。ただしシステムによっては記号が使用できない場合もあるため、対象サービスの仕様を確認してください。
パスワードマネージャーとの併用
生成したランダムパスワードは覚えることが困難なため、1Password・Bitwarden・KeePassXCなどのパスワードマネージャーへの保存を強く推奨します。パスワードマネージャーを使えば、サービスごとに異なる強力なパスワードを安全に管理できます。マスターパスワードのみ記憶すれば問題ありません。
ブラウザ内完結の安全性
このツールはすべての処理をブラウザ内で完結しています。入力した設定や生成されたパスワードはサーバーに送信されません。Web Crypto APIの crypto.getRandomValues() は暗号論的に安全な擬似乱数生成器(CSPRNG)を使用しており、Math.random() とは異なり予測不可能な乱数を生成します。

関連ツール

04
ハッシュ生成UUID生成パスワード強度チェック — 準備中

ソースコード

05

このツールのソースコード(テストコードを含む)はGitHubで公開しています。 MITライセンスで自由に利用・改変できます。

GitHub でコードを見る →