パスワード生成
暗号用の乱数で作ります。長さと文字を選べます。作った値はこの機器から出ません。
使える文字は82種類。20文字なら127ビット(とても強い)で、 1秒に100億回試されても平均300,000,000,000,000百万年かかります。
よくある質問
何文字にすればよいですか?
米国 NIST のガイドライン(SP 800-63B)は、そのパスワード1つでログインする用途なら15文字以上を求めています。二段階認証と組み合わせる場合でも8文字以上です。この道具の既定は20文字にしてあります。覚える必要がなく、パスワード管理ソフトに保存するなら、長くして困ることはありません。
記号は必ず入れるべきですか?
いいえ。NIST は「大文字・数字・記号を混ぜること」のような文字種の強制を禁じています(SHALL NOT)。理由は、人がその要求に予測できる形で応じるためです。password を選ぼうとした人は、大文字と数字を求められると Password1 にし、記号も求められると Password1! にするだけで、攻撃側はその変形をすでに知っています。文字種を増やすより長くするほうが、はるかに効きます。
定期的に変えたほうがよいですか?
いいえ。NIST は定期的な変更を求めてはならないと定めています(SHALL NOT)。定期変更を課すと、人は Pass01 → Pass02 のように予測できる変え方をするため、かえって弱くなります。変えるべきなのは、漏れた疑いがあるときです。
この道具で作った値は安全ですか?
ブラウザの暗号用の乱数(crypto.getRandomValues)を使っています。Math.random は予測できるため使っていません。また、作った値はお使いの機器の中だけで生まれ、通信は一切していません。ただし画面に表示している以上、共有の端末や、後ろから見られる場所では気をつけてください。
紛らわしい文字を外すと弱くなりませんか?
少しだけ弱くなります。5文字ぶん減るので、たとえば94種類が89種類になり、20文字なら約1.7ビット下がります。紙に書き写す場合など、l と I と 1、0 と O を読み違える危険のほうが大きい場面では、外したうえで1〜2文字長くするのが確実です。
「大文字・数字・記号を1つずつ」は、もう勧められていません
米国 NIST のデジタル・アイデンティティ・ガイドライン(SP 800-63B)は、 パスワードに文字種の組み合わせを強制してはならないと定めています。 推奨しない、ではなくSHALL NOT(してはならない)です。
理由は、人がその要求に予測できる形で応じるからです。 同文書はこう説明しています ── password を選ぼうとした利用者は、 大文字と数字を求められれば Password1 を選びやすく、 記号も求められれば Password1! にするだけだ、と。 攻撃側はその変形をとうに知っているので、規則を課しても強さはほとんど増えません。
同じ文書は、定期的な変更を求めてはならないとも定めています。 定期変更は Pass01 → Pass02 のような予測できる変え方を生むためで、 変えるべきなのは漏れた疑いがあるときだとされています。
効くのは長さです
文字種を増やすことと長くすることのどちらが効くか、数で比べられます。 総当たりの手間は「文字の種類数の、長さ乗」なので、長さは指数のほうに乗ります。
| 作り方 | 何ビットか |
|---|---|
| 数字だけ4桁暗証番号 | 約13ビット(1万通り) |
| 4種類すべてを使った8文字よくある「複雑さの規則」を満たしたもの | 約52ビット |
| 小文字だけ16文字記号も数字も大文字も無し | 約75ビット。文字種を絞っても、長いほうが上 |
| 4種類すべてを使った20文字この道具の既定 | 約131ビット |
「小文字だけ16文字」が「4種類で8文字」より強いのが、この話の要点です。 覚えられる形にしたいなら、記号を混ぜるより語をいくつも並べて長くするほうが、 覚えやすさと強さの両方で勝ちます。