Множество сводится к тому, как долго код может стать, как сильно вам нужно, чтобы он был уникальным, как трудно он должен быть непредсказуемым, и если у вас есть список действительных кодов.
длина
Первый-офф: простая математика означает, что если вы должны быть в состоянии генерировать бесконечное число уникальных случайных строк, которые являются уникальными, что вы не можете ограничить длину указанной строки (Это станет бесконечным ...).
Если вам нужно сохранить используемые значения в базе данных, обычно требуется максимальная длина.
Независимо от этого, неограниченная длина строк создает множество опасностей.
как уникальный?
Очевидно, что использование времени не очень уникально, но вы можете добавить все, чтобы столкновения становились все менее вероятными, и все это затрудняло прогнозирование.
Если у вас есть список (действующих) кодов, вы всегда можете проверить сгенерированный код на существующую базу данных и восстановить новый, если произойдет столкновение с действующим в настоящий момент.
Очевидно, что просто все больший счетчик будет гарантировать уникальность, но это не так удобно, как это не длина ограничена, очень предсказуемо и т.д.
трудно предсказать
Обычно кодов аутентификации, которые могут быть угаданы являются ужасная идея безопасности. Поэтому вам нужно защищаться от этого.
Объединяя это все
Чтобы объединить все это, вы можете создать конкатенации строки из:
- фиксированной, но секрет строки (сделать это долго) считает это ключевой фразой, что делает угадывание ввод чрезвычайно трудно
- IP-адрес клиента
номер
- порт, используемый клиентом
- тим е & дата
- псевдо случайных чисел
- строка клиент использует для идентификации себя
- пользователя
- ...
Вам не нужно брать все, порядок и т.д. все зависит от вас. Чем больше тем лучше.
Как только у вас есть эта строка, вы выбираете хеш-функцию, чем длиннее вывод хеша, тем менее вероятными будут столкновения, но чем больше хранится код, используемый в вашей базе данных.
Хорошим выбором в настоящее время будет sha-1 или sha-256 (md5 слишком сломан, чтобы использоваться во всех новых).
Это дает вам фиксированный по длине код, резко меняющийся, даже если вы просто изменяете один бит на входе, почти невозможно предсказать для злоумышленника и имеет крошечный шанс вызвать столкновение.
Как крошечный? Чрезвычайно маловероятно, см. Математику здесь: https://crypto.stackexchange.com/questions/24732/probability-of-sha256-collisions-for-certain-amount-of-hashed-values
Если вам нужно полностью исключить возможность и не допускать неограниченную длину кодов, вы можете проверить ее только на используемые коды, и если они будут найдены, вы можете создать новенький.
TL; DR
Вы можете добавить другие вещи, кроме времени, например, IP-адрес удаленной стороны соединения, псевдослучайное число, идентификатор процесса, фиксированная строка, которую вы храните в секрете, и т. Д. Смешиваете это и делаете хеш с использованием, например, sha-256, и у вас фиксированная длина трудно предсказать код.
Риск столкновения существует, но он чрезвычайно мал, если вы даете ему достаточно ввода, чтобы его устранить: проверьте список используемых кодов.
Это действительно полезно! Спасибо :) – Michael
Думал об этом немного больше и один последний вопрос. Я хочу, чтобы токен был гарантирован уникальным для этого пользователя, является ли неправильной практикой префикс идентификатора пользователя (а не имя пользователя, но уникальное значение auto increment int) до конца токена, это гарантирует, что токен никогда не может быть повторно использован другой пользователь. Просто немного осторожно, что если токен обновляется, но не правильно передается клиентскому приложению, а затем клиент пытается снова подключиться, но (сверхбыстрый шанс на это происходит), другой пользователь клиента обновил свой токен и потому, что токен не работает 't существует в db больше .... – Michael
..... этому новому клиенту дается это же значение токена на случайный случай, но тогда клиентское приложение, которое не получало обновленный токен, пыталось подключиться снова и потому что у этого клиента теперь есть тот же знак, что и у этого другого пользователя теперь будет доступ к этой другой учетной записи пользователей, небольшой шанс, но мне нужно приложить все усилия для предотвращения любого потенциального несанкционированного доступа. Надеюсь, что это ясно. – Michael