GNU/Linux >> Linux の 問題 >  >> Linux

Java SecureRandom はブロックしませんか?どのように?

OpenJDK と Sun の両方が /dev/urandom から読み取ります 、 /dev/random ではありません 、少なくとも私がテストしたマシン (Debian スクイーズ amd64 上の OpenJDK JRE 6b27 および Sun JRE 6.26) では。何らかの理由で、両方とも /dev/random を開きます 同様に、しかしそれから読んではいけません。つまり、あなたが読んだブログ記事は間違っているか、私のバージョンとは異なるバージョンに適用されたものです (そして、どうやらあなたのバージョンも)。

あなたが /dev/random から読み取るかどうかを確認できます または /dev/urandom それをたどることによって:

strace -o a.strace -f -e file java A

トレースの関連部分を探します:

21165 open("/dev/random", O_RDONLY)     = 6
…
21165 open("/dev/urandom", O_RDONLY)    = 7
…
21165 read(7, "\322\223\211\262Zs\300\345\3264l\254\354[\6wS\[email protected]", 20) = 20
…

心配しないで、/dev/urandom 暗号化にはまったく問題ありません。


Java の SecureRandom はできる /dev/random を使用しますが、短時間だけ使用してください。

具体的には、明示的に SecureRandom.generateSeed() を呼び出して、シード情報を生成するときにのみ使用します または nextInt() への最初の呼び出しによって

したがって、bash の例を繰り返すには、次のようにするとブロックされます。

import java.security.SecureRandom;

public class A {
    public static void main(String[] args) {
        SecureRandom sr;
        int out = 0;
        for (int i = 0; i < 1<<20 ; i++) {
            sr = new SecureRandom();
            out ^= sr.nextInt();
        }
        System.out.println(out);
    }
}

古いスレッドを存続させるだけでなく、一部の人々はこの背後にある長い物語の重要な部分を見逃している可能性があります...これは、Java バージョン 1.4 からバージョン 1.7 への /dev/urandom を使用する際の、よく知られた悪名高い永続的なバグに関するものです。以下のリンクを参照してください:

http://bugs.java.com/view_bug.do?bug_id=6202721

http://bugs.java.com/view_bug.do?bug_id=4705093

私が知っていることについては、Oracle が述べているように、これは最終的に Java 8 で対処されています:https://docs.oracle.com/javase/8/docs/technotes/guides/security/enhancements-8.html

<ブロック引用>

SHA1PRNG と NativePRNG が修正され、java.security ファイルの SecureRandom シード ソース プロパティが適切に尊重されるようになりました。 (file:///dev/urandom と file:/dev/./urandom を使用したあいまいな回避策は不要になりました。)


Linux
  1. LinuxにJavaをインストールする方法

  2. Ubuntu20.04にJava17をインストールする方法

  3. Fedora35にJava17をインストールする方法

  1. UbuntuにJavaをインストールする方法

  2. Vimrc –コメントをブロックする方法は?

  3. Ubuntu 22.04 に Java をインストールする方法

  1. CentOS7にJava11および12をインストールする方法

  2. Centos8にJava8および11をインストールする方法

  3. Ubuntu18.04にJavaをインストールする方法