安全な乱数でパスワードを作る道具です。差別化点は、なぜ安全なのかを主張するだけでなく
自分の目で確かめられること。 よくある実装は文字を選ぶのに 乱数 % 文字数 という
素朴な剰余法を使いますが、これは文字数が256を割り切らない限り必ず偏ります。
この道具は拒否サンプリング(rejection sampling)で偏りを避け、
その違いを実際に同じ回数だけ引いて、ヒストグラムとχ²検定で見せます
(下の「剰余法はなぜ偏るか」)。生成だけでなく、手持ちのパスワードの診断もできます。
| 総当たりされたら(平均) | 目安の速さ | かかる時間 |
|---|
これは力任せ攻撃だけの目安です。辞書攻撃や下の「気をつけるところ」に 挙がるような並びの弱さには、エントロピーの数字だけでは効きません。
いまのところ指摘はありません。
生成したものでなくても、既に使っているパスワードの弱さをその場で診断できます。 通信は行わないので、実在のパスワードを試しても外には出ません。 それでも、使い回している最重要のパスワード(メインメール等)は避けることをおすすめします。
まだ何も入力されていません。
乱数バイト(0〜255)をv % nで文字数 n に落とすと、
256 が n で割り切れない限り、余りの分だけ一部の文字が多く選ばれます。
拒否サンプリングは、割り切れる範囲(Math.floor(256/n)*n未満)を
超えたバイトを引き直すことで、これを避けます。理屈だけでなく、実際に同じ回数だけ両方を
引いてヒストグラムとχ²検定を出します。
crypto.getRandomValues だけを使います。
Math.random() は仕様上どの実装を使うか決まっておらず、多くのブラウザでは
暗号用途に設計されていない生成器(V8 は xorshift128+ 系)です。少数の出力から内部状態を
復元できる場合があり、パスワード生成には使ってはいけません。v % n)をそのまま使いません。
256 が文字数 n で割り切れないと、余りの分だけ一部の文字が多く選ばれます
(上の実験で実際に確かめられます)。拒否サンプリングで、割り切れる範囲を
超えたバイトは引き直すことで避けています。