2017-01-02 8 views
2

Так что я хочу, чтобы создать токен аутентификации, чтобы передать обратно клиенту, чтобы он мог использовать его для передачи с каждым запросом.Создайте полностью уникальный токен, который никогда не использовался с помощью php

Однако какова наилучшая практика для создания уникальных токенов, которые раньше не использовались.

Мне нужно гарантировать уникальность, поэтому я не могу полностью обосновать его на php uniqid(), так как существует минимальная вероятность того, что два пользователя будут входить в одно и то же время (очень маленький шанс, но не может воспользоваться этим шансом).

Неправильно ли использовать префикс значения uniqid() с их именем пользователя?

Также является отметкой времени, в которой uniqid() основана на чувствительности к повторяющимся значениям, когда часы возвращаются/переходят?

ответ

0

Множество сводится к тому, как долго код может стать, как сильно вам нужно, чтобы он был уникальным, как трудно он должен быть непредсказуемым, и если у вас есть список действительных кодов.

длина

Первый-офф: простая математика означает, что если вы должны быть в состоянии генерировать бесконечное число уникальных случайных строк, которые являются уникальными, что вы не можете ограничить длину указанной строки (Это станет бесконечным ...).

Если вам нужно сохранить используемые значения в базе данных, обычно требуется максимальная длина.

Независимо от этого, неограниченная длина строк создает множество опасностей.

как уникальный?

Очевидно, что использование времени не очень уникально, но вы можете добавить все, чтобы столкновения становились все менее вероятными, и все это затрудняло прогнозирование.

Если у вас есть список (действующих) кодов, вы всегда можете проверить сгенерированный код на существующую базу данных и восстановить новый, если произойдет столкновение с действующим в настоящий момент.

Очевидно, что просто все больший счетчик будет гарантировать уникальность, но это не так удобно, как это не длина ограничена, очень предсказуемо и т.д.

трудно предсказать

Обычно кодов аутентификации, которые могут быть угаданы являются ужасная идея безопасности. Поэтому вам нужно защищаться от этого.

Объединяя это все

Чтобы объединить все это, вы можете создать конкатенации строки из:

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

Риск столкновения существует, но он чрезвычайно мал, если вы даете ему достаточно ввода, чтобы его устранить: проверьте список используемых кодов.

+0

Это действительно полезно! Спасибо :) – Michael

+0

Думал об этом немного больше и один последний вопрос. Я хочу, чтобы токен был гарантирован уникальным для этого пользователя, является ли неправильной практикой префикс идентификатора пользователя (а не имя пользователя, но уникальное значение auto increment int) до конца токена, это гарантирует, что токен никогда не может быть повторно использован другой пользователь. Просто немного осторожно, что если токен обновляется, но не правильно передается клиентскому приложению, а затем клиент пытается снова подключиться, но (сверхбыстрый шанс на это происходит), другой пользователь клиента обновил свой токен и потому, что токен не работает 't существует в db больше .... – Michael

+0

..... этому новому клиенту дается это же значение токена на случайный случай, но тогда клиентское приложение, которое не получало обновленный токен, пыталось подключиться снова и потому что у этого клиента теперь есть тот же знак, что и у этого другого пользователя теперь будет доступ к этой другой учетной записи пользователей, небольшой шанс, но мне нужно приложить все усилия для предотвращения любого потенциального несанкционированного доступа. Надеюсь, что это ясно. – Michael

0

У вас уже есть база данных, в которой вы храните эти жетоны, чтобы вы могли проверить, является ли она правильной или нет. Если это правда, вы можете просто генерировать токен, как вы предпочитаете (то есть uniqid(), случайная строка, ... что бы вы ни хотели) и проверить, существует ли это в db. Если он не существует, вы можете пойти с ним, иначе вы можете создать новый и снова выполнить проверку.

+0

Подумал об этом, но может вызвать немного большую нагрузку на базу данных, выполняющую проверку над потенциально 1 миллионом пользователей каждый раз при создании нового токена. Но это мое решение для решения проблемы, если я не могу разработать способ создания маркера на отметке времени, а также уникальное значение, например. Имя пользователя. – Michael

+0

Добавление или добавление имени пользователя в метку времени должно работать, возможно, вы можете даже хеш-файл, чтобы он не был легко читаемым. –

+0

Я предполагаю, что если я его хэш, хотя он может быть более восприимчивым к коллизиям, более уникально использовать значение отметки времени и имени пользователя, но я не особо хочу отправить имя пользователя – Michael

-3

Этот метод работает для меня ...

$token = md5(date['u']); 

Использует количество секунд с начала эпохи (1 Jan 1970), так что почти гарантия вы получите уникальный одно значение времени. MD5 превращает это в строку с 32 символами. Вероятность двух одинаковых значений еще не совсем нулевая, но очень близка к нулю.

Использование параметра date w/'u' не будет проблемой из-за DST.

+0

Прежде всего, это НЕ гарантирует, что вы получите уникальный идентификатор, поскольку это не только возможно, но на самом деле вполне вероятно, что два или более (возможно, еще много!) пользователи войдут в систему в течение одной секунды, которая будет генерировать тот же токен. Во-вторых, теоретически возможно (хотя и маловероятно), что две * разные * даты будут генерировать ту же сумму MD5. – Kjartan

0

Вы можете использовать универсальный уникальный идентификатор UUID. Спецификации: rfc4122.

Выдержка:

Одной из основных причин для использования UUID, является то, что нет централизованных органа не требуется вводить их (хотя один формат использует IEEE 802 идентификаторов узлов, а другие нет). В результате генерация по запросу может быть полностью автоматизирована и использована для различных целей . Алгоритм генерации UUID, описанный здесь, поддерживает очень высокие скорости выделения до 10 миллионов в секунду на машину, если необходимо, чтобы они могли использоваться даже как идентификаторы транзакций.

UUID Генераторы

Есть UUID генераторы для различных языков, просто убедитесь, что реализация использует алгоритмы в RFC-4122 спецификации. Многие из них просто будут использовать случайное число для каждого гексагового октета UUID, что вызовет столкновения.

+0

Спасибо, любые примеры библиотек для php? – Michael

+0

Вы можете использовать функцию uniqid. http://php.net/manual/en/function.uniqid.php. Он генерирует уникальную строку, основанную на текущем времени в микросекундах –

 Смежные вопросы

  • Нет связанных вопросов^_^