GNU/Linux >> Tutoriales Linux >  >> Linux

¿Java SecureRandom no bloquea? ¿Cómo?

Tanto OpenJDK como Sun leen desde /dev/urandom , no /dev/random , al menos en la máquina donde probé (OpenJDK JRE 6b27 y Sun JRE 6.26 en Debian squeeze amd64). Por alguna razón, ambos abren /dev/random también, pero nunca lo leí. Entonces, los artículos del blog que leíste estaban equivocados o se aplicaron a una versión diferente a la mía (y, aparentemente, a la tuya).

Puedes comprobar si el tuyo lee desde /dev/random o /dev/urandom al rastrearlo:

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

y busque la parte relevante de la traza:

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
…

No te preocupes, /dev/urandom está perfectamente bien para la criptografía.


SecureRandom de Java use /dev/random, pero solo brevemente.

Específicamente, solo lo usa cuando genera información inicial, ya sea llamando explícitamente a SecureRandom.generateSeed() o por la primera llamada a nextInt()

Entonces, para repetir su ejemplo de bash, puede hacer lo siguiente, y debería bloquearse.

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

No solo para mantener vivo un hilo antiguo, sino que algunas personas podrían haberse perdido una parte importante de la larga historia detrás de esto... Se trata de un error infame y persistente muy conocido al usar /dev/urandom desde las versiones de Java 1.4 a las versiones 1.7. Consulte los enlaces a continuación:

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

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

Por lo que sé, esto finalmente se ha abordado en Java 8 como lo indica Oracle:https://docs.oracle.com/javase/8/docs/technotes/guides/security/enhancements-8.html

SHA1PRNG y NativePRNG se corrigieron para respetar correctamente las propiedades de la fuente de semillas SecureRandom en el archivo java.security. (Ya no se requiere la oscura solución utilizando file:///dev/urandom y file:/dev/./urandom).


Linux
  1. Cómo instalar Java en Linux

  2. Cómo instalar Java 17 en Ubuntu 20.04

  3. Cómo instalar Java 17 en Fedora 35

  4. Vimrc – ¿Cómo bloquear comentarios?

  5. Cómo instalar Java en Ubuntu 22.04

Cómo instalar Java en AlmaLinux 8

Cómo instalar Java en Manjaro 20

Cómo instalar Java en Debian 11

Cómo instalar Java en Ubuntu 18.04

Cómo instalar Java en CentOS 8

¿Cómo instalar Java en Ubuntu 18.04?