security / password
パスワード生成
大文字・小文字・数字・記号の組み合わせでランダムなパスワードを生成します。 Web Crypto APIを使用し、生成はすべてブラウザ内で完結します。入力内容はサーバーに送信されません。
16
864
強い95 bit
使い方
01- スライダーでパスワードの長さ(8〜64文字)を選択します
- 使用する文字種(大文字・小文字・数字・記号)をチェックボックスで選択します
- 設定変更のたびに自動でパスワードが再生成されます。「再生成」ボタンで手動再生成も可能です
- 「コピー」ボタンでクリップボードにコピーできます。「表示/非表示」で文字の表示を切り替えられます
- 「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ソースコード
05このツールのソースコード(テストコードを含む)はGitHubで公開しています。 MITライセンスで自由に利用・改変できます。
GitHub でコードを見る →