パスワード生成

本物の暗号論的乱数(CSPRNG)で生成する、強力なランダムパスワード。すべてブラウザ内で完結します。

パスワード設定

16
文字種
見間違えやすい文字(0, O, l, 1, I)を除きます。

16文字・94種類の文字集合 → エントロピー 104.9 ビット

生成されたパスワード

「生成」をクリックしてください。何も保存されません — 使うものはコピーしてください。

OS と同じ乱数源を使うパスワード生成ツール

このツールは `crypto.getRandomValues()` — Web Crypto API が提供する暗号論的に安全な乱数生成器 — を使ってランダムなパスワードを生成します。これは鍵やトークンの生成に OS が使うのと同じ種類の乱数源です。手軽ですが予測されないことを目的として設計されていない `Math.random()` は、セキュリティに関わる用途には使いません。

ランダムなバイト値を文字集合に対応させる部分こそ、自作のパスワード生成ツールがひそかに間違えやすい箇所です。素朴な `randomByte % 文字数` という方法は、文字数が256を割り切らない限り(つまりほぼ常に)偏りが生じます。このツールでは代わりに棄却サンプリング(rejection sampling)を使い、偏りが生じる範囲に入ったバイト値は捨てて新しく引き直すことで、選ばれた文字集合内のすべての文字が完全に等しい確率で選ばれるようにしています。

長さ(8〜64文字)、混ぜ合わせる文字種(小文字・大文字・数字・記号)、そして紛らわしい見た目の文字(0/O、1/l/I)を除外するかどうかを選べます。有効にした文字種のいずれかが生成結果に一つも含まれなかった場合は、その文字種から取った文字で1文字を置き換えます。そのため「数字と記号を含むパスワードを作る」と指定すれば、実際にその両方が含まれる結果を確実に得られます。

オンラインのパスワード生成ツールを安易に信用してはいけない理由

生成されたパスワードは、存在した瞬間から秘密の情報です。それをサーバーに送る — たとえ一瞬でも、記録しないと約束するサービスであっても — ということは、事実ではなく約束を信用するということです。ここには、信用すべき対象そのものがありません。

  • 生成はすべて、ブラウザに組み込まれた Web Crypto API を使ってブラウザ内で行われます。
  • ページは静的ファイルとして配信され、生成したパスワードを運ぶリクエストは一切送信しません。アクセス解析用の通信であっても例外ではありません。
  • localStorage や履歴機能など、端末上のどんな形の保存にも書き込みません。パスワードはそのページが開かれている間だけ表示され、コピーしない限り消えます。
  • パスワードを URL に埋め込むような共有リンク機能はありません。
  • ソースは公開されており、誰でも読めます(MIT)。
  • オフラインで動作します。これは、データが端末から出ないからこそ可能です。

ご自分で確かめるなら、パスワードを生成中にブラウザの Network パネルを開いてください。パスワードを運ぶリクエストは出ていません。 ソースを読む。

使い方

  1. 長さと文字種を設定

    長さのスライダー(8〜64文字)を動かし、含める文字種(小文字・大文字・数字・記号)を切り替えます。

  2. 必要なら紛らわしい文字を除外

    「紛らわしい文字を除外」をオンにすると、見間違えやすい文字(0/O、1/l/I)を除きます。手入力や読み上げが必要なパスワードに便利です。

  3. 生成する件数を選ぶ

    複数の候補が欲しい場合は件数(最大20件)を設定し、「生成」をクリックします。

  4. 使いたいものをコピー

    生成された各パスワードには、それぞれ専用のコピー用ボタンがあります。ページを離れたり再読み込みしたりすると何も残らないため、使うものは必ずコピーしてください。

よくある質問

生成したパスワードはどこかに送信されますか?

いいえ。生成はすべて、ブラウザ内の Web Crypto API を使って行われます。サーバー側の処理はなく、パスワードを運ぶアクセス解析通信もなく、共有リンク機能もありません。自分でコピー&ペーストしない限り、生成したパスワードが端末の外に出る経路はありません。

乱数源が何であるかは、なぜ重要なのですか?

`Math.random()` は高速で汎用的な擬似乱数生成器ですが、少数のサンプルから出力を予測できないという保証はありません。攻撃者に予測されないことを目的として設計されたものではないのです。`crypto.getRandomValues()` は暗号論的に安全な乱数生成器で、ブラウザ(最終的には OS)の CSPRNG に支えられています。これは暗号鍵の生成にも使われるのと同じ種類の乱数源であり、パスワードのようなものに使うべき唯一適切な選択です。

「モジュロ偏り(modulo bias)」とは何ですか。このツールはどう避けていますか?

ランダムなバイト値(0〜255)を `byte % 文字数` で文字集合に対応させると、256 がその文字数で割り切れない場合、文字集合の前半にある文字がわずかに多く選ばれてしまいます。これは理論上の話ではなく、実際に測定できる偏りです。このツールでは代わりに棄却サンプリングを使います。256 未満に収まる文字数の最大の倍数を計算し、その値以上のバイトが引かれた場合は、モジュロで縮めるのではなく破棄して新しく引き直します。この処理を通過したすべての文字は、完全に等しい確率になります。

「文字種カバレッジの保証」とは何ですか?

パスワード全体は、まず上記の偏りのないランダムな抽出によって生成されます。次に、有効にした文字種(たとえば記号)のいずれかが結果に一つも含まれていなかった場合 — 有効な文字種が多く、パスワードが短いほど起こりやすい状況です — その文字種からランダムに選んだ文字で、ランダムに選んだ1文字を置き換えます。この置き換えにも同じ暗号論的な乱数源を使います。これにより、4つの文字種すべてを有効にすれば、偶然の巡り合わせに頼らず確実に4種類すべてを含む結果が得られます。

なぜ「強度メーター」ではなくビット数のエントロピーを表示するのですか?

色分けされた強度メーターは、主観的でしばしば誤解を招く演出です。ビット数のエントロピー — 長さ × log2(有効な文字集合サイズ)— は、確認可能な事実の数値です。このパスワードが選ばれた空間全体を(log2 の意味で)総当たりするのに何回の一様ランダムな試行が必要かを、そのまま表しています。その数値をどう使うか(サービス側の要件と比べる、十分かどうか判断するなど)は利用者の判断に委ねます。

生成したパスワードの履歴は保存されますか?

いいえ、意図的に保存しません。localStorage やその他いかなる端末上のストレージにも書き込みません。ページを離れるか再読み込みすると、コピーしなかったパスワードはすべて消えます。これほど機微な情報に対する正しい既定の挙動です。

「紛らわしい文字」とは何で、なぜ除外するのですか?

一部の文字は、特定のフォントや読み上げ時に見間違えたり打ち間違えたりしやすいものです。数字の 0 と文字の O、数字の 1 と小文字の l、大文字の I などです。「紛らわしい文字を除外」をオンにすると、この5文字だけが文字集合から除かれます。その分、同じ長さでの文字集合サイズ(したがってエントロピー)はわずかに小さくなります。

オフラインでも使えますか?

はい。PWA なので、一度アクセスすればキャッシュされ、ネット接続が無くても使えます。もともとネットワークを必要としない処理内容なので、自然な挙動です。ホーム画面に追加することもできます。