simpleは内部で通常のRandomを使用しており、これはメルセンヌツイスターという安全ではない乱数です。では、ここでの安全というのはなにかというと、暗号などに安全に使えるかどうかと言うことです。SecureRandomのような安全な乱数生成機は暗号論的擬似乱数生成器と言われています。
まず乱数というのは統計学的に十分にランダムであることが求められ、これはそのような乱数は良い乱数と言われています。Randomが使用しているメルセンヌツイスターも良い乱数の一つですので、悪いわけではありません。しかし、そこからさらに、ある条件を見たなさなければ安全であるとは言えません。それは、排出された乱数から次の乱数を多項式時間の計算によって予測することができないことです。
通常の乱数はとてもランダムのように見えますが、ある程度の数の排出済み乱数があれば(その数は実装による)現在のシード値を予測できます。シード値が予測できれば、次の乱数の値も予測できます。これは、乱数生成機の逆演算のようなことができるようになっているからです。しかし、暗号論的擬似乱数生成機はその逆計算ができないようになっています。もちろん、乱数には周期がありますので全ての周期を回せばどのシード値だったのかを出す事はできますが、非常に多い周期の場合は現実的ではなく、実質、シード値がわからない、つまり、次に排出される乱数を予測することは不可能となります。
乱数が予測できると言うことは、乱数によって作られるリストも予測されてしまうと言うことです。
あくまで前回出ている乱数から次の乱数を予測すると言うだけなので、一回だけしか乱数を使わなければ関係無いと思うかも知れません。ですが、果たして本当に未来永劫に渡ってその一回だけなのでしょうか?連続してパスワード生成するとか変更があるかも知れません。例えば、Aさん用にパスワードを作成して、続けてBさん用にパスワードを作成し、それぞれ渡したとしましょう。この場合、Aさんが何らかのきっかけでBさんが次の人であると言うこと知った場合、自分のパスワードからBさんのパスワードを予測することが可能であれば、Bさんになりすましてログインすると言ったことが可能になります。しかし、暗号論的擬似乱数生成機を使用した場合、AさんがBさんのパスワードを予測するには現実的ではない時間が必要になり、その方法でBさんになりすますのはほぼ不可能になります。
他にも細かい条件があるのですが、上のリンク先のWikipediaも参考にしてみてください。とにかく、パスワードなど生成など予測されては絶対にいけないような物には、SecureRandomのような暗号論的擬似乱数生成機を使うことがお約束のような物になっています。もし、使用していなかった場合、そのアプリケーションに内在する脆弱性の一つとみなされます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/03/16 13:38