パスワード生成と検証ツール

強力なパスワードとパスフレーズを生成し、一括生成・一意性・強度・ポリシー検証をサポート。複数言語のコード例と実用的な知識を提供します。

パスワード生成ツール

記号グループの選択
ヒント:グループを選択するか、直接文字をクリックして除外できます。
結果

パスワードポリシー検証ツール

結果
  • 長さ
  • 小文字
  • 大文字
  • 数字
  • 記号
  • 連続パターン
  • 繰り返し
  • ブラックリスト
すべての検証はあなたのブラウザ内でローカルで実行されます。

パスフレーズ生成ツール

単語はセキュアなランダム生成(Web Crypto)によって選択されています。デモ用語彙はファイルサイズ制限のため短めです。

パスワードハッシュ推奨ガイド

Argon2id
  • Argon2idを使用し、適切なメモリコストを設定してください
  • 反復回数 ≥ 2、メモリ ≥ 64MB(環境に応じて調整)
  • ユーザーごとに独立したソルトを保存;アプリケーション層でペッパーの使用を検討
PBKDF2
  • SHA-256 または SHA-512 を選択し、反復回数 ≥ 210,000(必要に応じて調整)
  • 各ハッシュに一意なソルトを使用;パラメータのアップグレードをサポート
  • 次回ログイン時により高コストなパラメータへ移行
BCrypt
  • コストは 10–14 に設定(サーバーの処理能力に応じて調整)
  • パスワードの切り捨てを避け、完全なパスワードをハッシュ化
  • 認証エンドポイントにリクエスト制限と監視を実装
参照:NIST SP 800-63B、OWASP ASVS。パラメータはハードウェア能力とSLOに合わせて調整してください。

パスワード強度評価

強度はエントロピーに基づいています:entropy = log2(文字プールサイズ) × 長さ。より大きな文字プールと長い長さにより、推測の難易度が向上します。

  • 弱い: < 50 ビット —— 一回限りまたは低価値なシナリオにのみ適しています
  • 普通: 50–80 ビット —— 低リスクシナリオで許容可能
  • 強い: 80–110 ビット —— 推奨されるデフォルト目標
  • 非常に強い: > 110 ビット —— 管理者または重要なアカウントに適しています

ヒント:実際の攻撃モデルには差異があります。パスワードの再利用を避け、マルチファクタ認証(MFA)を有効にしてください。

使用方法

  • 長さと文字セット(小文字/大文字/数字/記号)を選択;必要に応じて「類似文字を避ける」または「各タイプを必須にする」を有効化してください
  • より細かい制御が必要な場合:除外する文字/文字グループを指定、または記号グループを選択してください
  • 生成ボタンをクリック;複数の結果が必要な場合は、一括生成を有効にして一度にすべてコピーできます
  • 既存のパスワードを検証したい場合は「ポリシー検証ツール」を使用;覚えやすいパスフレーズが必要な場合は「パスフレーズ生成器」をご利用ください

機能特性

  • セキュアな乱数生成(Web Crypto)
  • 設定可能な文字セットと記号グループ
  • 類似文字フィルタリングとカスタム除外
  • 一括生成・一意性保証・重複排除統計
  • 強度とエントロピー指標
  • ポリシー検証ツールとパスフレーズ生成器
  • 複数言語のコードサンプル (JS、Python、PHP、Go、Java、C#、Rust)
  • ワンクリックコピー(単一/すべて)

パスワード生成例

強力(Strong)
長さ24、大文字・小文字・数字・記号を含む
覚えやすい(Memorable)
長さ16、大文字・小文字・数字を含み、似た文字を避ける

パスワード知識庫

1) パスワードの強度とエントロピー
  • エントロピー ≈ log2(文字プールのサイズ) × 長さ;長さの影響が一般的に大きい
  • 推奨目標:一般アカウント ≥ 80 ビット;高権限/財務関連 ≥ 110 ビット
  • 文字プールを広くし、長さを増やす → 推測に対する耐性が向上
2) 長さ vs 複雑さ
  • 記号を無理に追加するより、長さを伸ばす方が効果的です
  • 固定で予測可能なパターン(例:常に「先頭大文字+末尾数字!」)は避けてください
  • まず十分な長さを確保し、その後で文字の多様性を適度に高めましょう
3) よくある誤解と逆パターン
  • キーボード列(qwerty)、繰り返しブロック、生年月日/年份などは、ルールベースの攻撃にかかりやすい
  • 「共通の基本パスワード+サイト名の接尾語」は変種の再利用であり、リスクが集中しやすく推測されやすい
  • 複数のウェブサイトで同じパスワードを使用しないでください
4) パスワード管理の推奨事項
  • パスワードマネージャーを利用し、各サイトごとに一意のパスワードを使用;重要アカウントではMFAを有効化してください
  • 公開のチャネルでパスワードを平文で送信しない;必要に応じて「発音しやすいパスフレーズ」を使用してください
  • 漏洩や再利用が判明した場合は、直ちに変更し、一意化を徹底してください
5) パスフレーズ(Passphrase)のガイドライン
  • 4~6語の単語組み合わせは、強力かつ覚えやすい傾向があります
  • 区切り文字を混ぜたり、最初の文字を大文字にしたり、数字を挿入することで、強度と読みやすさを両立できます
  • よくあるフレーズ/歌詞/格言をそのままつなげるのは避けてください

パスワードセキュリティ実践ガイド

ベストプラクティス
  • 十分な長さを確保:一般アカウントは16文字以上、重要アカウントは24文字以上を推奨
  • 記憶が必要な場合はパスフレーズを優先;ランダムで高强度なパスワードはパスワードマネージャーに保存することを推奨
  • 可能な限り多要素認証(MFA)を有効化してください
  • 異なるウェブサイトではパスワードを再利用せず、各アカウントに一意のパスワードを使用してください
エントロピーと強度

エントロピーは、長さと文字セットのサイズに基づく予測不可能性を表します。エントロピーのビット数が高くなるほど、通常はより強力です。

  • 最大の効果を得るには、長さを優先して増やしてください
  • 可能であれば複数の文字セットを使用してください
  • 文字を過剰に除外すると文字セットが小さくなり、強度が低下します
ポリシーとローテーション
  • 複雑な構成ルールよりも、長さと一般的・漏洩したパスワードのブラックリストを優先してください
  • 頻繁な強制的なローテーションは避けて、漏洩やリスクが発生した場合のみ変更してください
  • 漏洩パスワードリストを利用して、一般的・漏洩したパスワードの使用を阻止してください
パスフレーズ
  • 4~6個のランダムな単語を区切り文字で連結してください(例:lake-CARROT-planet_7)
  • 有名なフレーズや歌詞などの一般的な表現は避けてください。機知に富んだものより、ランダム性が重要です
  • 重要なアカウントには、パスワードマネージャーで真正に高エントロピーなランダムパスワードを保存することを推奨します
生成設定のヒント
  • 「選択した各セットを必須にする」は、各カテゴリが少なくとも1回出現することを保証します
  • 「似た文字を避ける」は読みやすさを向上させますが、文字セットのサイズをわずかに縮小します
  • 記号は、対象システムが許容するサブセットに制限できます
サーバー側の保存
  • パスワードを平文で保存しないでください。強力なハッシュ(Argon2id/PBKDF2/BCrypt)とソルトを使用してください
  • 適切なパラメータ(メモリ/時間/コスト)を設定し、必要に応じてペッパーを使用してください
  • 試行速度を制限し、失敗試行を監視してください。攻撃を受けた場合はCAPTCHAやデバイス検証を導入してください
多要素認証と復元
  • TOTPまたはハードウェアキーを優先;SMSの使用はできるだけ避けてください
  • 復元プロセスを保護:多要素認証またはメール認証を用い、クールダウン期間を設けてください
  • バックアップ復元コードを提供し、ユーザーに安全に保管するよう勧めてください
ブルートフォース攻撃への対策
  • 漸進的な遅延/ロックとIP/デバイスリスクスコアリングを導入してください
  • APIおよびログインフォームにWAF/レート制限を設定してください
  • クラッキング攻撃を監視し、ユーザーに一意なパスワードの使用を促してください
ローカル保存と処理
  • 信頼できるパスワードマネージャーを使用して保存および自動入力を行ってください
  • パスワードをチャットやメールで平文で共有しないでください。チームではシークレット管理ツールをご利用ください
  • オフラインで記録する必要がある場合は、物理的な安全性を確保してください
免責事項:本ツールはブラウザ内でWeb Cryptoを使用してパスワードを生成しており、データはサーバーに送信されません。

プログラミング言語でのパスワード生成方法

JavaScript(Web Crypto)
function randomPassword(length = 16, sets = {lower:true, upper:true, digits:true, symbols:true}) {
  const pools = {
    lower: 'abcdefghijklmnopqrstuvwxyz',
    upper: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
    digits: '0123456789',
    symbols: '!@#$%^&*+-=_~`|/?()[]{}<>,.;:\'\"'
  };
  let pool = '';
  for (const k of Object.keys(sets)) if (sets[k]) pool += pools[k];
  if (!pool) throw new Error('No charset');
  const bytes = new Uint32Array(length);
  crypto.getRandomValues(bytes);
  let out = '';
  for (let i = 0; i < length; i++) out += pool[bytes[i] % pool.length];
  return out;
}
Python(secrets)
import secrets

def random_password(length=16, lower=True, upper=True, digits=True, symbols=True):
    pools = {
        'lower': 'abcdefghijklmnopqrstuvwxyz',
        'upper': 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
        'digits': '0123456789',
        'symbols': '!@#$%^&*+-=_~`|/?()[]{}<>,.;:\'\"'
    }
    pool = ''.join(v for k, v in pools.items() if locals()[k])
    if not pool:
        raise ValueError('No charset')
    return ''.join(secrets.choice(pool) for _ in range(length))
PHP(random_int)
function random_password($length = 16, $sets = ['lower'=>true,'upper'=>true,'digits'=>true,'symbols'=>true]) {
    $pools = [
        'lower' => 'abcdefghijklmnopqrstuvwxyz',
        'upper' => 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
        'digits' => '0123456789',
        'symbols' => '!@#$%^&*+-=_~`|/?()[]{}<>,.;:\'\"'
    ];
    $pool = '';
    foreach ($sets as $k => $on) if ($on) $pool .= $pools[$k];
    if ($pool === '') throw new Exception('No charset');
    $out = '';
    for ($i = 0; $i < $length; $i++) {
        $out .= $pool[random_int(0, strlen($pool)-1)];
    }
    return $out;
}
Go(crypto/rand)
package main

import (
  "crypto/rand"
  "math/big"
)

func RandomPassword(length int, pool string) (string, error) {
  out := make([]byte, length)
  for i := 0; i < length; i++ {
    nBig, err := rand.Int(rand.Reader, big.NewInt(int64(len(pool))))
    if err != nil { return "", err }
    out[i] = pool[nBig.Int64()]
  }
  return string(out), nil
}
Java(SecureRandom)
import java.security.SecureRandom;

public class Pw {
  static final String POOL = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*+-=_~`|/?()[]{}<>,.;:'\"";
  static final SecureRandom SR = new SecureRandom();
  static String randomPassword(int length) {
    StringBuilder sb = new StringBuilder(length);
    for (int i = 0; i < length; i++) {
      int idx = SR.nextInt(POOL.length());
      sb.append(POOL.charAt(idx));
    }
    return sb.toString();
  }
}
C#(.NET RandomNumberGenerator)
using System;
using System.Security.Cryptography;

public static class Pw {
  public static string RandomPassword(int length, string pool) {
    using var rng = RandomNumberGenerator.Create();
    var bytes = new byte[length];
    rng.GetBytes(bytes);
    var chars = new char[length];
    for (int i = 0; i < length; i++) {
      chars[i] = pool[bytes[i] % pool.Length];
    }
    return new string(chars);
  }
}
Rust(rand + getrandom)
use rand::rngs::OsRng;
use rand::RngCore;

fn random_password(length: usize, pool: &str) -> String {
    let mut bytes = vec![0u8; length];
    OsRng.fill_bytes(&mut bytes);
    let chars: Vec = pool.chars().collect();
    bytes
        .iter()
        .map(|b| chars[(*b as usize) % chars.len()])
        .collect()
}

fn main() {
    let pool = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*+-=_~`|/?()[]{}<>,.;:'\"";
    let pw = random_password(16, pool);
    println!("{}", pw);
}