Класс 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
Случайный класс], https://docs.oracle.com/javase/8/docs/api/java/security/Provider.html [Provider
Учебный класс]
ссылка://тег/гостевой пост/[гостевой пост]ссылка://тег/java-security/[java безопасность]ссылка://тег/пароль/[пароль]ссылка://тег/случайные числа/[случайные числа]ссылка://тег/безопасность/[безопасность]