Как предотвратить коллизии при генерации ключей активации регистрации? - PullRequest
3 голосов
/ 12 ноября 2011

Я работаю над системой регистрации большого проекта.

После успешной регистрации сервер генерирует ключ активации, добавляет его в строку пользователя и отправляет пользователю по электронной почте. Для этого используется некоторый класс генератора паролей.

Вопрос (я знаю, что это звучит абстрактно, но мне просто интересно), как избежать дублирования генерации проходов? Я имею в виду, есть ли шанс, что в будущем генератор сможет создать ключ активации, который уже существует в таблице БД? Стоит ли проверять дублирование после генерации ключа?

Ответы [ 5 ]

3 голосов
/ 12 ноября 2011

Я бы рекомендовал использовать пакет Text_Password от PEAR. Не пытайтесь изобретать это колесо.

Не заставляйте пароли быть строго уникальными. На самом деле менее безопасно иметь такое принуждение. Учтите, что если я попытаюсь установить свой пароль на xyzzy , и сайт скажет мне, что я не могу, это означает, что теперь я знаю, что какая-то учетная запись использует xyzzy в качестве пароля. Я просто должен попробовать этот пароль на всех учетных записях, пока не найду какой.

Не используйте хеш-дайджест в качестве сгенерированного пароля. Ваши пользователи не хотят вводить шестнадцатеричную строку длиной 32 символа (или более). У меня был опыт кодирования пакета ключей активации безопасного программного обеспечения в 2001 году с использованием хешей PKI и MD5. Но никто не использовал бы его, потому что ключи были слишком длинными.

Используйте хэш-дайджест и соль для хранения паролей. Прочтите эту статью нашего бесстрашного лидера: Возможно, вы неправильно храните пароли .

См. Также мои ответы на несколько других вопросов, связанных с паролем:

2 голосов
/ 12 ноября 2011

Попробуйте uniqid().

1 голос
/ 12 ноября 2011

Использование алгоритма хеширования, такого как SHA или Whirlpool с уникальным входом (например, уникальное имя пользователя пользователя), приведет к хешу с ожидаемой частотой столкновений 0.

IЯ бы не стал использовать мой собственный алгоритм для этого.uniqid() или md5(), как уже упоминалось, являются гарантированными решениями.

0 голосов
/ 21 декабря 2011

Используйте GUID в качестве регистрационного ключа, поскольку он всегда уникален и генерируется системой

0 голосов
/ 12 ноября 2011

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

$key = md5(time());
...