Для ссылки подтверждения, сброса пароля или временного приглашения нужен непредсказуемый токен. Обычный Random для этого не подходит, поэтому используем SecureRandom.
Создадим генератор случайных байтов:
private static final SecureRandom RANDOM =
new SecureRandom();
Теперь напишем метод генерации:
static String generateToken(int size) {
byte[] data = new byte[size];
RANDOM.nextBytes(data);
return Base64.getUrlEncoder()
.withoutPadding()
.encodeToString(data);
}URL Encoder не использует символы, которые могут сломать адрес. Дополнительное кодирование результата не требуется.
Создадим токен из 32 случайных байтов:
String token = generateToken(32);
System.out.println(token);
Пример результата:
Pp1HgxVmySpQJQi3KUUPN5ZXqCV4-ZPvP12Ft49XiI0
Теперь его можно добавить в ссылку:
String link =
"https://ready.com/confirm?token=" + token;
На сервере безопаснее хранить хеш токена:
var digest = MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest(
token.getBytes(StandardCharsets.UTF_8)
);Также у токена должен быть срок действия и возможность только одноразового использования.
👉 Java Ready | #практика