# パスワード・パスフレーズ — 強い乱数を、ブラウザの中で

作るのはこのページ、動くのは手元のブラウザ。どこにも送られず、保存もされず、履歴も残りません。

> 強いランダムなパスワードを作る、あるいは同梱の7,776語のリストからdicewareのパスフレーズを作る。ブラウザ自身の暗号用乱数から引き、どこにも送らず、保存もしません。無料・登録不要。

これはhttps://abox.tools/ja/password-generator/にあるブラウザー用の対話型ツールです。ファイルはそのブラウザーを実行する端末上で処理します。意図した共有や任意の通信機能はページ内で説明します。以下は文章による説明です。利用するにはアドレスを開いてください。

## パスワードとパスフレーズは**ブラウザー内で処理**されます。処理のためのアップロードはありません。

どの一文字も`crypto.getRandomValues`、つまりブラウザ自身の暗号用乱数から引かれ、どの単語もこのフォルダにある`src/wordlist.js`から引かれます。`src/`のどこにも`fetch`も`XMLHttpRequest`も`sendBeacon`もないので、ここで作られたパスワードが私たちにも誰にも届く経路がありません。保存もしないので、このページを再読み込みすれば、これまで表示したパスワードはすべて消えます。

- ✗ アップロードなし
- ✗ アカウント不要
- ✗ 保存なし
- ✓ オフラインで動作
- ✓ ソース公開

## サイトに見られずに強いパスワードを作る手順

1. **パスワードかパスフレーズかを選びます。** パスワードはランダムな文字の並びで、保管しやすく、打つのは面倒で、パスワード管理ソフトが代わりに入力してくれる何百というアカウントにはこれが正解です。パスフレーズはリストから無作為に引いた単語の並びで、長い代わりに覚えられて口に出せます。自分の頭から打ち込む必要がある数少ない秘密、つまりパスワード管理ソフト自身のパスワード、パソコンのパスワード、スマートフォンの復旧コードにはこちらです。
2. **長さ、または単語数を決めます。** 効くのはこの設定で、ほかはたいていそうではありません。守る価値のあるものなら20文字、または6単語が妥当な下限です。ほかのすべてを再設定できてしまうアカウントなら、そこから上げてください。下の表示はつまみを動かすたびに変わるので、1文字増やすと何が増えるのかがその場で分かります。
3. **登録フォームが言い張る規則を入れます。** 「各種類から最低一つ」、末尾に数字、どのサイトでも通る短い記号。どれも強くはしませんし、最初のものはむしろわずかに弱くします。それはこのページが既に差し引いてあります。ただ、六回作り直さずに登録フォームを抜けるにはこれが要ります。
4. **色ではなく数字を読みます。** ビット数は、その文字列を生み出した設定から数えています。文字集合の大きさと、引いた回数と、それだけです。これは本当の測定で、登録ページのメーターとは違います。あちらは目の前の文字に点をつけることしかできず、それを選んだのが人か生成ツールかを知る手立てがありません。
5. **立ち去る前にコピーして、どこかに置きます。** ここには履歴がなく、もう一度出してもらう方法もありません。再読み込みすれば消えます。まずパスワード管理ソフトに貼り、そのあとで登録フォームに貼ってください。覚えておく側が先に持っていれば、途中で何かあっても失われません。
6. **まとめて要るならまとめて作ります。** 一番下のつまみで一度に最大100個まで作れ、テキストファイルとして保存できます。中身は画面に出ているものからこのページが書き出したものです。アカウントをまとめて開くときや初期パスワードを配るときに便利ですが、より良い場所に移したらファイルは消してください。ディスクの上のパスワードだらけのファイルは、やはりパスワードだらけのファイルです。

## 詳しい解説

[オンラインのパスワード生成ツールを使っても安全ですか？](https://abox.tools/ja/guides/is-it-safe-to-use-an-online-password-generator/): その疑いは正しい、だから検証する：ブラウザの乱数はどこから来るのか、生成ページは何を間違えうるのか、そして目の前のページが作ったものを保持できるかどうかを見分ける検査。

## 箱の中のほかのツール

- [JSONフォーマッター](https://abox.tools/ja/json-formatter/): JSON・XML・HTML・CSS・YAMLを、整形するか変換します。よそのサーバーに貼り付けるものは何もありません。
- [YAML・JSON変換](https://abox.tools/ja/yaml-to-json/): 双方向で、それぞれの代償も伝えます。どちらも、よそのサーバーに貼り付けられることはありません。
- [XMLフォーマッター](https://abox.tools/ja/xml-formatter/): 読むために整えたXML、送るために平たく圧縮したXML、そして双方向のJSON変換。そのどれも、よそのサーバーに貼り付けられることはありません。
- [テキスト差分](https://abox.tools/ja/text-diff/): 2つのテキストを入れると、すべての違いが行単位・単語単位で印付きで出てきます。よそのサーバーに貼り付けるものは何もありません。

## よくある質問

### パスワードはどこかに送られたり、保存されたりしますか。

パスワードはブラウザーで生成し、コードはアップロードや履歴保存をしません。コピーや保存は本人の選択です。共通のページ枠は設定や言語切替用の一時設定を保持できますが、生成された秘密の出力は含めません。CSPは接続先を制限し、許可済みリクエストの内容を証明するものではありません。コードと通信を確認してください。

### 乱数はどこから来ますか。

`crypto.getRandomValues`です。暗号用途のためにブラウザが用意している乱数で、手元のOSのエントロピープールが種を与え、与え直しています。ブラウザがTLSの鍵素材を引くのと同じ出どころです。この道具では`Math.random`をどこでも使っていません。これは細かい話ではなく、`Math.random`は速い算術的な乱数で、内部状態は連続した数個の出力から丸ごと復元できます。それで作られたパスワードは、ランダムに見えるだけで、一つ見た人にはすべて列挙できてしまいます。

### ブラウザで作ったパスワードは、パソコンのソフトで作ったものと同じくらい良いですか。

乱数に関しては同じです。どちらもOSの同じ出どころに、別の入口から届いているだけです。違うのは、同じ部屋に何がいるかです。ブラウザのタブは拡張機能と隣り合って動きますし、ページを読む権限のある拡張機能はこのページも読めます。これはこのページを含むあらゆるウェブ上の生成ツールに言えることで、手元にパスワード管理ソフトがあるならその内蔵の生成機能を使うべき正直な理由でもあります。算術は同じで、隣に立っているものが少ないだけです。このページは、それが手元にないときのためのものです。

### パスワードとパスフレーズ、どちらを使うべきですか。

管理ソフトが代わりに打ってくれるものはすべてパスワードで構いません。二度と目にしませんし、長さはただですから。自分の頭から打つか、声に出して伝える必要がある数少ないものにはパスフレーズです。管理ソフトのマスターパスワード、ディスク暗号化の鍵、遠隔で設定する機器などです。長いリストから6単語で77ビット、12文字のランダムなパスワードより強く、しかも午前4時に打ち間違えず入力できる度合いが桁違いです。

### パスワードは何文字にすべきですか。

全部の文字集合で20文字ならおよそ130ビットで、長さを気にする段階はとうに過ぎています。16文字でも十分です。失って困るものの下限が12文字で、これは下限であって目標ではありません。それより短いと、サイトが正しく保管していることに賭けることになりますが、この20年の漏えい通知はその賭けを勧めていません。長さはこのページのどの設定にも勝ちます。1文字増やすほうが、どの文字を含めという規則より効きます。

### パスフレーズは何単語にすべきですか。

長いリストから6単語、他のパスワードを守るものなら7単語です。有名な4単語の絵は2011年のもので51ビット、今日では本気のオフライン攻撃の射程に入ります。5単語で64、6単語で77です。普通のアカウント一つに攻撃者が費やす額を超えています。長いリストの1単語ごとに12.9ビット増え、増えるのは単語だけです。ハイフンも大文字も増やしません。

### 「ビット」とは何で、なぜこのページはそれを数えるのですか。

1ビットは倍になることです。60ビットとは、このページが出しえた同じ確からしさの結果が2^60通りあったということで、仕組みを完全に知っている相手でも、なおそれだけ試す必要があります。これは文字列の性質ではなく*手順*の性質です。このページは選んだ当人で、何回選んだかを知っているので、正確に言えます。そこが登録フォームの色付きバーとの違いで、あちらは文字を読んで当てているだけです。あのバーでは`correct horse battery staple`は評価が低く実際は44ビット、`P@ssw0rd!`は評価が高く実際はほぼ無価値です。

### 「記号を必ず含める」がパスワードを弱くするのはなぜですか。

規則は可能性を減らすことしかできないからです。各種類から最低一つを求めると、たまたま一つも入らなかったパスワードがすべて除かれます。ありうるパスワードの集合が小さくなれば、探す範囲も小さくなります。効きは小さく、普通の長さでおよそ0.5ビットですが、それは実在します。このページは自分に都合のよい数字を出さずに、これを差し引いています。しかも、規則が実際に許すパスワードの数を数えて正確に求めています。

### この単語リストは何で、攻撃者がダウンロードできることは問題になりませんか。

Electronic Frontier Foundationのdicewareリストを、そのまま同梱しています。長いほうが7,776語、短いほうが1,296語です。まさにこの用途のために作られていて、不快な語がなく、同音異義がなく、つなげると別の語になってしまう組み合わせがなく、短いリストではどの語も他の語の先頭になっていません。そして、リストが公開されていることは問題になりません。ここに書かれた強さは、攻撃者がリストを持ち、このページのソースを読み、使った設定をすべて知っている前提で計算しています。分からないのは、毎回7,776語のどれが出たかだけです。その前提こそが、この数字を信用できるものにしています。

### パスフレーズは辞書攻撃を待っているようなものではありませんか。

こういう選び方をしている限り違います。辞書攻撃が効くのは*人が*考えたフレーズです。人は互いに馴染む語を、意味の通る順で、日ごろ使う数千語の中から選ぶからです。このページは固定されたリストから、一語ずつ独立に、均等に引き、読み心地は一切考えません。だからたいてい読み心地は悪くなります。リストも単語数も知っている攻撃者の前に残るのは、7,776の単語数乗です。

### ページを離れたあとで、パスワードを取り戻せますか。

できませんし、そうしてあります。どこにも書き留めないので、取り戻すものがありません。履歴の画面も、「最近作ったもの」の一覧も、キャッシュもありません。先週の火曜のパスワードを見せられる生成ツールとは、それを保存していた生成ツールです。自分が取り出せる場所に保存されているということは、ほかの何かも取り出せる場所に保存されているということです。離れる前にパスワード管理ソフトへコピーしてください。

### クリップボードにコピーしても安全ですか。

ごく普通の危険で、恐れるより知っておくほうが役に立ちます。クリップボードは同じ利用者として動いているすべてと共有され、たいてい次にコピーするまで残り、設定によっては端末間で同期されます。だから貼るべき場所にすぐ貼って、その後に別のものをコピーするのがよいのであって、代わりに弱いパスワードを手で打つ理由にはなりません。このページはクリップボードを読めません。書き込めるだけで、しかもボタンを押したときだけです。

### 同じものを複数の場所で使ってもいいですか。

いけません。これはこのページのどの助言よりも上に来る唯一の一つです。乗っ取られるアカウントのほとんどは、先に別の場所で正しかったパスワードで乗っ取られます。あるサイトが破られ、一覧が公開され、同じアドレスと同じパスワードがあらゆる場所で試されるからです。サイトごとに違うパスワードにすれば、漏えいの被害は全部ではなく一つで済みます。パスワード管理ソフトを使う理由はここにあるのであって、中に入っている個々のパスワードの強さではありません。

### 無料ですか。アカウントは要りますか。

無料です。アカウントもログインも試用期間もなく、いくつ作ってもかまいません。このサイトは広告で成り立っていますが、広告にはこのページが作るものについて何も渡りません。長さも強さも渡りません。

### オフラインでも動きますか。

動きます。一度ページを読み込んでからインターネットを切っても、パスワードは作り続けられます。乱数は手元の端末から来ますし、単語リストはすでにページの中にあります。これは、何も取りに行かず何も送っていないことの一番簡単な証明でもあります。数字をサーバーに取りに行く生成ツールなら、線を抜いた瞬間に止まります。

## この主張を確かめる方法

- **処理はこのブラウザー内で行います。** このページの中で、このページが、手元のOSがブラウザに渡す乱数から引きます。作るために何かを取りに行くこともなければ、出来上がったことを報告することもありません。`Content-Security-Policy`にはこのページが接続してよい宛先がすべて書かれていて、そのどれ一つとして私たちのものではありません。生成したパスワードが集まる先はここになく、あったとしてもそこへ送るコードがありません。
- **ここには何かを取りに行くものがありません。** `src/`のどこにも`fetch`も`XMLHttpRequest`も`sendBeacon`もありません。単語リストもダウンロードしていません。`src/wordlist.js`という一つのファイルで、ページの他の部分と一緒にこのオリジンから配信されていて、中身を読むこともできます。
- **乱数はブラウザのもので、しかも正しい種類のものです。** `crypto.getRandomValues`は鍵やトークンのためにブラウザが用意している乱数で、OSが種を与え、与え直しています。`Math.random`はこのフォルダのどこにもありませんし、あれば本物の欠陥です。内部状態は数個の出力から復元できてしまうので、出力を一つ見た人には、それが今後生成するパスワードがすべて計算できます。
- **何も保存しないので、消すべき履歴がありません。** localStorageもsessionStorageもCookieもURLパラメータもなく、ブラウザが記憶を申し出るような`<input>`もありません。画面にあるものはこのページのメモリ上の配列一つの中だけにあり、タブを閉じればそれで後片付けは終わりです。ここで作られたものの控えは、持ち出したぶんだけです。
- **Googleが読み込むものと、渡されないもの。** 広告と計測のスクリプトはGoogle、寄付ボタンはBuy Me a Coffeeのものです。そのどれにも、このページが作ったものの一文字も渡りません。長さも、強さも、どの設定で作ったかも渡りません。一文字や一単語を引くコードはすべてこのオリジンから配信され、リポジトリに載っています。
- **オフラインでも動きます。** ネットワークを切っても道具は変わりません。もともと通信する段取りがどこにもないからです。これが一番簡単な証明で、乱数をサーバーに取りに行く生成ツールなら、線を抜いた瞬間に止まります。

**自分で確かめてください。**以上のどれも、鵜呑みにする必要はありません。このページは、リポジトリにあるテンプレートと設定から、誰でも読んで実行できるビルドスクリプトが生成しています。その結果は`dist`ブランチに置いてあるので、配信されているものと、ソースをビルドした結果とを差分で比べられます。 https://github.com/A-Box-of-Tools/website

まず読むとよいのは、Content-Security-Policyについては`config/site.toml`、このページと生成されるすべてのパスワードとの間にある40行が`src/random.js`です。入力は一つしかなく、それがブラウザ自身の乱数です。設定が文字列になるまでが`src/generate.js`、あの数字の裏側の算術が`src/strength.js`で、こちらは推測ではなく数え上げています。
