Статьи

Добавьте немного энтропии к вашей JVM

Возможность генерировать истинные случайные числа зависит от энтропии в вашей системе. Некоторые утверждают, что это может быть гарантировано честным броском костей . Другие считают, что замена java.math.Random.nextInt () метода OpenJDK на это тело поможет:

1
2
3
public int nextInt() {
  return 14;
}

Но это абсурд. Мы все знаем, что лучший способ добавить истинную энтропию в JVM — переписать java.lang.Integer.IntegerCache при запуске вашей JVM. Вот код:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import java.lang.reflect.Field;
import java.util.Random;
 
public class Entropy {
  public static void main(String[] args)
  throws Exception {
 
    // Extract the IntegerCache through reflection
    Class<?> clazz = Class.forName(
      "java.lang.Integer$IntegerCache");
    Field field = clazz.getDeclaredField("cache");
    field.setAccessible(true);
    Integer[] cache = (Integer[]) field.get(clazz);
 
    // Rewrite the Integer cache
    for (int i = 0; i < cache.length; i++) {
      cache[i] = new Integer(
        new Random().nextInt(cache.length));
    }
 
    // Prove randomness
    for (int i = 0; i < 10; i++) {
      System.out.println((Integer) i);
    }
  }
}

Когда я в последний раз пытался, выше напечатано

01
02
03
04
05
06
07
08
09
10
92
221
45
48
236
183
39
193
33
84

Не верь этому? Попробуйте это в своем приложении! Испытывая это в своем заявлении, вы соглашаетесь со следующими условиями лицензирования :

Если это не требуется действующим законодательством или не согласовано в письменной форме, программное обеспечение, распространяемое по лицензии, распространяется на условиях «КАК ЕСТЬ», БЕЗ ГАРАНТИЙ ИЛИ УСЛОВИЙ ЛЮБОГО РОДА, явных или подразумеваемых.

Ссылка: добавьте немного энтропии в вашу JVM от нашего партнера по JCG Лукаса Эдера из блога JAVA, SQL и JOOQ .