Рубрики
Без рубрики

Ява – Как создавать сильные случайные числа

– Java – Как для создания сильных случайных чисел

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

1. Генератор Паролей С Использованием Безопасного Случайного

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

package com.mkyong.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 дает нам возможность установить семя через .установить семя () метод. Этот метод может принимать либо длинное число, либо массив байтов. Воздержитесь от заполнения SecureRandom , так как это почти всегда ставит под угрозу безопасность генератора случайных чисел; вместо этого позвольте ему использовать свой внутренний механизм заполнения. Это не означает, что одно семя должно использоваться бесконечно. Для приложений, которые работают с большим количеством случайных чисел, вы должны периодически генерировать новый SecureRandom , так как это создаст новый генератор с новым начальным значением.

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

  1. Улучшения безопасности JDK 8
  2. Безопасный Случайный класс
  3. Класс поставщика

Оригинал: “https://mkyong.com/java/java-how-to-create-strong-random-numbers/”