Как вы эффективно генерируете безопасную случайную (или псевдослучайную) буквенно-цифровую строку в Java?
Как эффективно генерировать безопасную случайную буквенно-цифровую строку в Java?
Ответ 1
Инициализируйте массив, содержащий все принятые символы (CHARS_ARRAY
), затем создайте экземпляр SecureRandom и вызовите nextInt(CHARS_ARRAY.length)
повторно для получения случайного индекса в вашем массиве char. Добавьте каждый char в StringBuilder
, пока не получите ожидаемое количество символов.
Ответ 2
Здесь немного измененная версия моего кода из дублирующего вопроса.
public final class RandomString
{
/* Assign a string that contains the set of characters you allow. */
private static final String symbols = "ABCDEFGJKLMNPRSTUVWXYZ0123456789";
private final Random random = new SecureRandom();
private final char[] buf;
public RandomString(int length)
{
if (length < 1)
throw new IllegalArgumentException("length < 1: " + length);
buf = new char[length];
}
public String nextString()
{
for (int idx = 0; idx < buf.length; ++idx)
buf[idx] = symbols.charAt(random.nextInt(symbols.length()));
return new String(buf);
}
}
Ответ 3
Используя UUID:
UUID random = UUID.randomUUID();
System.out.println( random );
Ответ 4
Сгенерируйте открытый ключ для алгоритма шифрования с открытым ключом и преобразуйте последовательность байтов в строку с помощью алгоритма Base64.
Ответ 5
import java.security.SecureRandom;
import java.util.Random;
public class PasswordHelper {
public static String generatePassword (int length) {
//minimum length of 6
if (length < 4) {
length = 6;
}
final char[] lowercase = "abcdefghijklmnopqrstuvwxyz".toCharArray();
final char[] uppercase = "ABCDEFGJKLMNPRSTUVWXYZ".toCharArray();
final char[] numbers = "0123456789".toCharArray();
final char[] symbols = "^[email protected]#%&".toCharArray();
final char[] allAllowed = "abcdefghijklmnopqrstuvwxyzABCDEFGJKLMNPRSTUVWXYZ0123456789^[email protected]#%&".toCharArray();
//Use cryptographically secure random number generator
Random random = new SecureRandom();
StringBuilder password = new StringBuilder();
for (int i = 0; i < length-4; i++) {
password.append(allAllowed[random.nextInt(allAllowed.length)]);
}
//Ensure password policy is met by inserting required random chars in random positions
password.insert(random.nextInt(password.length()), lowercase[random.nextInt(lowercase.length)]);
password.insert(random.nextInt(password.length()), uppercase[random.nextInt(uppercase.length)]);
password.insert(random.nextInt(password.length()), numbers[random.nextInt(numbers.length)]);
password.insert(random.nextInt(password.length()), symbols[random.nextInt(symbols.length)]);
}
return password.toString();
}
}
Ответ 6
http://download.oracle.com/javase/6/docs/api/java/security/SecureRandom.html
Из Javadoc:
SecureRandom random = new SecureRandom();
byte bytes[] = new byte[20];
random.nextBytes(bytes);
Ответ 7
String chrs = "0123456789abcdefghijklmnopqrstuvwxyz-_ABCDEFGHIJKLMNOPQRSTUVWXYZ";
SecureRandom secureRandom = SecureRandom.getInstanceStrong();
// 9 is the length of the string you want
String customTag = secureRandom.ints(9, 0, chrs.length()).mapToObj(i -> chrs.charAt(i))
.collect(StringBuilder::new, StringBuilder::append, StringBuilder::append).toString();
System.out.println(customTag);
Примеры:
// q3HX6EctP
// WjRrMjQT4
// sX-Piq4DB