Java - Как создать сильные случайные числа

Класс SecureRandom в Java предоставляет криптографически безопасный генератор псевдослучайных чисел, и его целевое использование предназначено для приложений, чувствительных к безопасности.

В этом примере мы не будем использовать его по назначению, а представим его методы в простом генераторе паролей.

1.Password Generator с использованием безопасного случайного

Соглашение, которое мы создали для нашего генератора паролей, заключается в том, что окончательный пароль может состоять из заглавных букв A-Z, строчных букв a-z, цифр 0-9 и символов #, $,%,

PasswordGenerator.java

package com.techfou.passwordgen;

import java.io.UnsupportedEncodingException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.Collections;

public class PasswordGenerator {

    private SecureRandom srand;
    private ArrayList validch;

    public PasswordGenerator() throws NoSuchAlgorithmException, NoSuchProviderException {
        srand = new SecureRandom();
        validch = new ArrayList<>();

       //Filling the ArrayList with the characters we want to use based on ascii table:
       //https://www.cs.cmu.edu/~pattis/15-1XX/common/handouts/ascii.html
        for (int i = 65; i < 91; i++) {
            validch.add((char) i);//A-Z
            validch.add((char) (i + 32));//a-z
        }
        for (int i = 48; i < 58; i++) {
            validch.add((char) i);
        }
        for (int i = 35; i < 39; i++) {
            validch.add((char) i);
        }
        validch.add((char) 64);
        Collections.shuffle(validch);
    }

    public char randChar() {
        return (char) this.validch.get(srand.nextInt(this.validch.size()));
    }

    public static void main(String[]args) throws NoSuchAlgorithmException,
        NoSuchProviderException, UnsupportedEncodingException {

        PasswordGenerator pg = new PasswordGenerator();

        StringBuilder sb = new StringBuilder();
        for (int j = 0; j < 10; j++) {//Generate 10 passwords
            for (int i = 0; i < 10; i++) {//Passwords are 10 characters long
                sb.append(pg.randChar());
            }
            System.out.println(sb.toString());
            sb.setLength(0);
        }

    }

}

Выход:

s96g9RH%BH
%Cs5DjHgRD
xGea5Kb&5b
QomXOfC98s
BU0s%gqK6J
0yOkL%SHrT
j@drmKSwhy
aKwriP#xd9
XxdjIT7jr@
Qd7OE1RYNi

В приведенном выше примере мы вызвали SecureRandom с конструктором по умолчанию. Вместо этого мы могли бы инициировать SecureRandom, используя алгоритм и провайдера. В зависимости от потребностей нашего приложения, нам, возможно, придется указать поставщика, но в общем случае лучше воздержаться от него и позволить системе использовать алгоритм с наивысшим приоритетом.

2. Установка семени на SecureRandom

SecureRandom дает нам возможность установить начальное значение с помощью метода .setSeed (). Этот метод может получить либо длинное число, либо байтовый массив. Воздержитесь от заполнения «SecureRandom», поскольку это почти всегда ставит под угрозу безопасность генератора случайных чисел; вместо этого позвольте ему использовать свой внутренний механизм посева. Это не значит, что одно семя следует использовать бесконечно. Для приложений, которые запускают много случайных чисел, вы должны периодически генерировать новый SecureRandom , поскольку это создаст новый генератор с новым начальным числом.

Рекомендации

8 Улучшения безопасности], https://docs.oracle.com/javase/8/docs/api/java/security/SecureRandom.html [Secure

Учебный класс]

ссылка://тег/гостевой пост/[гостевой пост]ссылка://тег/java-security/[java безопасность]ссылка://тег/пароль/[пароль]ссылка://тег/случайные числа/[случайные числа]ссылка://тег/безопасность/[безопасность]