Почему бы просто не назначить случайное 64-битное число для отправки с идентификатором пользователя. Возьмите 64-битное число, разбейте его на 5-битные блоки и используйте каждый 5-битный блок для индексации в 32-символьный алфавит: 23456789ABCDEFGHJKLMNPQRSTUVWXYZ (удобно, без 01IO). С 64-битным числом и 5-битным / кодом (кроме последнего) вы получаете 13-символьный слаг для идентификации пользователя. Вы можете добавить к нему 2 случайных символа, чтобы получить 3 группы по 5 символов, если хотите.
Сделайте id и часть слагов в URL логина. Проверьте значение слага, сохраненного с идентификатором в базе данных, чтобы убедиться, что они совпадают. Я думаю, что для большинства целей это было бы достаточно большое значение, чтобы было очень трудно угадать - число в конце концов случайное - какой слаг идет с каким идентификатором пользователя. Используя криптографически надежный генератор случайных чисел, я думаю, что маловероятно, что вы даже получите повторные числа для любого из ваших пользователей.
Может выглядеть так:
http://example.com/activate?userid=bgates&validate=GY45M-RHQBN-32GYM
Использование хэша известных значений может фактически помочь кому-то угадать правильный код, чем использование случайного числа. Используя хеш, нужно только угадать, какие биты вы используете, и запустить их с помощью различных алгоритмов хеширования. Если кто-то может собрать их вместе, скажем, с учетом нескольких примеров и достаточно времени, чтобы попробовать различные комбинации, то все, что ему нужно сделать, чтобы взломать чей-то код, - это определить (вероятно) общеизвестные атрибуты для данного человека и использовать их для олицетворения их и создать учетную запись. С сильным случайным числом, присваиваемым каждому человеку, им остается только атака грубой силой.