JavaのランダムジェネレータRandom、SecureRandom


一時パスワードを電子メールで送信しようとすると、パスワードが生成されて伝達される瞬間に好奇心が生じる.
学生の頃、初めて数字を生成するとき、たまにRandom関数を使っていたようで、今回はSecureRandomを知りました.

なぜランコムは暗号学的に安全ではないのか


https://docs.oracle.com/javase/8/docs/api/java/util/Random.html
java.util.Randomインスタンスは暗号学的に安全ではない.
SecureRandomの代わりにSecureRandomを使用して、セキュリティに敏感なアプリケーションで安全な暗号化擬似乱数生成器を得ることをお勧めします.
Random関数は確かに整数を生成します.
しかし,真の整数を生成するのではなく,整数に見えるアルゴリズムにより規則整数を生成する.
人間とは異なり、コンピュータは無意識の選択や偶然の選択を行うことができないため、デフォルトの入力に基づいて固定的な値を与えるしかない.
「一般的なランダムは本当に任意の値ではなく、ある方法で複数の計算プロセスを経て、任意の値のように見えます.」「医乱」と呼ぶ.
この問題を解決する方法は、異なる乱小切手を読み出すたびに複数の乱小切手を作成することです.
この小切手を「種」と呼ぶ.ただし、シード値が同じであれば、選択した文字化けしも同じであるため、シード値も文字化けしていなければならない.つまり、卵数を1つ作成すると、卵数が必要になるという問題が発生します.
https://namu.wiki/w/%EB%82%9C%EC%88%98%EC%83%9D%EC%84%B1
すなわち、標準として値を設定し、ランダムに見える値を表示します.
シード値が同じ場合は、毎回同じ値が表示されます.
    @Test
    @DisplayName("Random함수 테스트")
    void randomTest() {
        int i = 0;
        while (i < 3) {
            Random random = new Random(10);
            for (int j = 0; j < 5; j++) System.out.println(random.nextDouble());
            i++;
        }
    }

繰り返しパターンが見えます.正確なランダムではありません.
この問題を解決するために、デフォルトではSEED値を時間として指定しますが、攻撃者がシードの作成時間を知っている場合は、
危険かもしれない.

ThreadLocalRandom


Random関数はマルチスレッド環境で同時に要求されたときに同じ値を返さない.
ただし、ねじ間で同じインスタンスを同時に使用すると、競合が発生します.
大きなパフォーマンス低下をもたらします.
ThreadLocalRandomはRandomに比べてオーバーヘッドと競合がずっと小さい.
Randomと同じように、暗号学的には安全ではありません.

SecureRandom


48ビットのみのRandom関数とは異なり、
  • SecureRandomは最大128ビットまで含むことができる.
    繰り返す可能性はもっと低い.
  • オペレーティングシステムから任意のデータを取得
    ->ex)類似数値を生成するために/dev/randomのようなファイルを使用します.
  • FIPS 140-2(暗号学で使用するジェネレータ規格)で指定されたテストを遵守するため、
  • より安全である.
  • より安全なアルゴリズム(SHA 1 PRNG)
  • を実施する
       @Test
        @DisplayName("SecureRandom함수 테스트")
        void secureRandomTest() throws NoSuchAlgorithmException {
            int i = 0;
            while (i < 3) {
                SecureRandom random = SecureRandom.getInstanceStrong();
                //  getInstanceStrong() : 보안속성에 지정된 알고리즘을 사용하여 SecureRandom 객체를 반환한다.
                for (int j = 0; j < 5; j++) System.out.printf("%.5f  ", random.nextDouble());
                i++;
                System.out.println();
            }
        }

    thread-safe




    Java 7から内部同期を行い、スレッドのセキュリティを明確に保証します.
    references:
    https://docs.oracle.com/javase/8/docs/api/java/util/Random.html
    https://docs.oracle.com/javase/8/docs/api/java/security/SecureRandom.html
    https://withseungryu.tistory.com/1
    https://kdhyo98.tistory.com/m/48