Как вы эффективно генерируете безопасную случайную (или псевдослучайную) буквенно-цифровую строку в 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
