GNU/Linux >> Tutoriels Linux >  >> Linux

Java SecureRandom ne bloque pas ? Comment?

OpenJDK et Sun lisent à partir de /dev/urandom , pas /dev/random , du moins sur la machine où j'ai testé (OpenJDK JRE 6b27 et Sun JRE 6.26 sur Debian squeeze amd64). Pour une raison quelconque, ils ouvrent tous les deux /dev/random ainsi mais jamais lu de celui-ci. Ainsi, les articles de blog que vous avez lus étaient soit erronés, soit appliqués à une version différente de la mienne (et, apparemment, de la vôtre).

Vous pouvez vérifier si le vôtre lit à partir de /dev/random ou /dev/urandom en le traçant :

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

et recherchez la partie pertinente de la trace :

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
…

Ne vous inquiétez pas, /dev/urandom convient parfaitement à la cryptographie.


SecureRandom de Java fait utilisez /dev/random, mais seulement brièvement.

Plus précisément, il ne l'utilise que lors de la génération d'informations de départ, soit en appelant explicitement SecureRandom.generateSeed() ou par le premier appel au nextInt()

Donc, pour répéter votre exemple bash, vous pouvez faire ce qui suit, et cela devrait bloquer.

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

Pas seulement pour garder un vieux fil en vie, mais certaines personnes ont peut-être manqué une partie importante de la longue histoire derrière cela... Il s'agit d'un bogue infâme et persistant bien connu lors de l'utilisation de /dev/urandom des versions Java 1.4 aux versions 1.7. Voir les liens ci-dessous :

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

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

Pour ce que je sais, cela a finalement été résolu dans Java 8 comme indiqué par Oracle :https://docs.oracle.com/javase/8/docs/technotes/guides/security/enhancements-8.html

SHA1PRNG et NativePRNG ont été corrigés pour respecter correctement les propriétés de la source de semences SecureRandom dans le fichier java.security. (La solution de contournement obscure utilisant file:///dev/urandom et file:/dev/./urandomi n'est plus nécessaire.)


Linux
  1. Comment installer Java sur Linux

  2. Comment installer Java 17 dans Ubuntu 20.04

  3. Comment installer Java 17 dans Fedora 35

  4. Vimrc – Comment bloquer un commentaire ?

  5. Comment installer Java sur Ubuntu 22.04

Comment installer Java sur AlmaLinux 8

Comment installer Java sur Manjaro 20

Comment installer Java sur Debian 11

Comment installer Java sur Ubuntu 18.04

Comment installer Java sur CentOS 8

Comment installer Java sur Ubuntu 18.04 ?