GNU/Linux >> Linux Esercitazione >  >> Linux

Java SecureRandom non si blocca? Come?

Sia OpenJDK che Sun leggono da /dev/urandom , non /dev/random , almeno sulla macchina su cui ho testato (OpenJDK JRE 6b27 e Sun JRE 6.26 su Debian squeeze amd64). Per qualche motivo, entrambi aprono /dev/random pure ma mai letto da esso. Quindi gli articoli del blog che hai letto sono stati sbagliati o applicati a una versione diversa dalla mia (e, a quanto pare, dalla tua).

Puoi controllare se il tuo legge da /dev/random o /dev/urandom tracciandolo:

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

e cerca la parte rilevante della traccia:

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
…

Non preoccuparti, /dev/urandom va benissimo per la crittografia.


SecureRandom di Java fa usa /dev/random, ma solo brevemente.

Nello specifico lo usa solo quando genera informazioni di inizializzazione, chiamando esplicitamente SecureRandom.generateSeed() o dalla prima chiamata a nextInt()

Quindi, per ripetere il tuo esempio bash puoi fare quanto segue, e dovrebbe bloccarsi.

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);
    }
}

Non solo per mantenere in vita un vecchio thread, ma alcune persone potrebbero essersi perse una parte importante della lunga storia che c'è dietro... Si trattava di un bug ben noto e persistente quando si utilizzava /dev/urandom dalle versioni Java 1.4 alle versioni 1.7. Vedi i link qui sotto :

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

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

Per quanto ne so, questo è stato finalmente risolto in Java 8 come affermato da Oracle:https://docs.oracle.com/javase/8/docs/technotes/guides/security/enhancements-8.html

SHA1PRNG e NativePRNG sono stati corretti per rispettare correttamente le proprietà dell'origine seed SecureRandom nel file java.security. (L'oscura soluzione usando file:///dev/urandom e file:/dev/./urandomi non è più richiesta.)


Linux
  1. Come installare Java su Linux

  2. Come installare Java 17 in Ubuntu 20.04

  3. Come installare Java 17 in Fedora 35

  4. Vimrc – Come bloccare il commento?

  5. Come installare Java su Ubuntu 22.04

Come installare Java su AlmaLinux 8

Come installare Java su Manjaro 20

Come installare Java su Debian 11

Come installare Java su Ubuntu 18.04

Come installare Java su CentOS 8

Come installare Java su Ubuntu 18.04?