java random prng entropy

Trabajando ÚNICAMENTE con/dev/random en Java



prng entropy (1)

Tengo un HRNG que alimenta / dev / random en Debian Wheezy. Es rápido, por lo que el bloqueo no será un problema. Ahora, en mi código de Java, quiero asegurarme de que uso la entropía en / dev / random y SÓLO esa entropía. No tengo ningún interés en usar nada de / dev / urandom.

Quiero forzar que el SecureRandom de Java SOLO obtenga entropía de / dev / random. Como entiendo la implementación en este momento, usa / dev / urandom cuando se llama a getBytes (), pero / dev / random cuando se llama a generateSeed (). No entiendo por qué.

Según tengo entendido, la única razón para leer desde / dev / urandom es si prefieres la velocidad por encima de la seguridad. Quiero la entropía de la más alta calidad posible. / dev / urandom simplemente no funcionará.

Entonces, ¿cómo obligo a SecureRandom SOLAMENTE a usar / dev / random (proporcionado por un HRNG) y nunca toco nada desde un PRNG inferior (como / dev / urandom)?

Gracias mil.


Esta respuesta supone que sabes lo que estás haciendo. En otros casos, el uso de / dev / random debe ser minimizado .

/dev/random actúa como un archivo normal, por lo tanto, cualquier programa que pueda leer cualquier archivo puede leer desde /dev/random . Probablemente sepas que cat /dev/random genera datos aleatorios directamente de él, y si lo hace lo suficientemente rápido, de hecho podrías querer usarlo. Entonces, si todo lo demás falla, siempre serás capaz de leer directamente ese archivo ...

Entonces, si mira el origen de SecureRandom , descubre que usa SecureRandomSpi para el trabajo real. Resulta que NativePRNG.Blocking hace lo que quieres:

Una clase similar a NativePRNG que usa / dev / random para semilla y material aleatorio. Tenga en cuenta que no respeta las propiedades egd, ya que no tenemos forma de saber cuáles son esas cualidades. Esto es muy similar a la clase NativePRNG externa, minimizando cualquier rotura a la serialización de la implementación existente. Desde: 1.8

El problema podría ser el Since 1.8 , que te deja con la posibilidad de respaldarlo en plataformas anteriores, si aún no puedes usar Java 8. El código fuente está disponible después de todo.

Entonces, ahora pongamos esto en código:

Tenemos que seleccionar la implementación específica para usar. Para encontrar el nombre exacto, damos salida a todos los servicios disponibles con la siguiente línea:

for (Provider p: Security.getProviders()) p.getServices().forEach(System.out::println);

Luego buscamos Native allí, y encontramos la siguiente entrada:

SUN: SecureRandom.NativePRNGBlocking -> sun.security.provider.NativePRNG$Blocking

Esto significa que podemos instanciar el objeto SecureRandom como se muestra a continuación para hacer lo que desee:

SecureRandom sr = SecureRandom.getInstance("NativePRNGBlocking", "SUN");

Una prueba simple

byte[] b = new byte[10000]; sr.nextBytes(b); System.out.println(Arrays.toString(b));

lleva años, tuve que reducir la cantidad de bytes leídos. Si funciona para usted, ¡enhorabuena, está leyendo desde /dev/random !

Sin embargo, tenga en cuenta que esta clase se encuentra en el paquete sun.security.provider , que no se garantiza que esté disponible en todas partes. Por ejemplo, probablemente no funcione en Android. Si esto está bien, entonces esta solución funcionará; de lo contrario, debería leerla directamente como un archivo.

No leer desde /dev/random en Android. Por favor.