2009-05-06 1 views
6

Я создаю скрипт, который принимает список имен и адресов электронной почты, и отправляет электронное письмо с предложением зарегистрироваться на нашем безопасном веб-сайте. Список имен и электронных писем доступен на открытой странице на том же сайте. Мне нужен способ предоставить им уникальный токен, который будет идентифицировать их, когда они будут следовать ссылке в электронном письме на страницу, чтобы зарегистрировать учетную запись. Пользователь будет использовать токен только один раз, чтобы создать учетную запись и установить свой первоначальный пароль.Стратегии для аутентификации пользователей один раз без предварительно разделяемого идентификатора

Каким будет лучший способ генерации токена? Случайная строка, хранящаяся в базе данных? Хэш генерируется из информации пользователя и некоторой соли? Что-то другое? Я понимаю, что безопасность этого метода зависит от конфиденциальности индивидуального приглашения на электронную почту, что я понимаю.

+1

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

ответ

3

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

Так связь они получают в электронной почте что-то вроде:

http://domain.com/confirm.php?user=Chad&t=AB14CD05 

Это действительно не имеет значения, если есть какое-либо столкновение, это довольно низкий риск события в любом случае. В любом случае, что может пойти не так, кто-то другой может подтвердить свой адрес электронной почты для них? Что вас беспокоит? Возможно, если вы объясните весь процесс немного подробнее, я лучше пойму ваши требования.

+0

Я думаю, что мне нужно изменить вопрос. Ваше право, я не должен найти лучший способ создать хеш для удовлетворения моих потребностей, но я должен спросить, каково будет решение общей проблемы аутентификации, когда единственным полу-частным идентификатором является токен, который я посылаю в приглашении Эл. адрес. Должен ли я внести изменения в свой вопрос или разместить новый? –

9

Существует множество различных алгоритмов хеширования. Вы можете посмотреть эту ссылку, чтобы узнать, будет ли работать для вас лучше, поскольку вам не нужен безопасный хеш. Вы также можете посмотреть, как SSL lib будет генерировать 8-значный md4-хэш.

http://www.partow.net/programming/hashfunctions/#top

1

Заканчивать gperf.

GNU gperf - идеальная хеш-функция генератор. Для данного списка строк он генерирует хеш-функцию и хеш-таблицу в виде кода C или C++ для поиска значения, зависящего от от входной строки. Хеш-функция является совершенной, что означает, что таблица hash не имеет столкновений, а для хэша поиск в таблице нуждается только в одной строке .

А также CMPH - C Minimal Perfect Hashing Library

Есть несколько связанных SO вопросы:

+0

Спасибо за ответы, кажется, я задал неправильный вопрос. –

+0

Тот, кто просто занижен, спасибо за «месть» downvote –

2

Почему не просто присвоить случайное 64-разрядное число, чтобы отправить с идентификатором пользователя. Возьмите 64-битное число, разделите его на 5-битные куски и используйте каждый 5-разрядный кусок для индексирования в 32-символьный алфавит: 23456789ABCDEFGHJKLMNPQRSTUVWXYZ (удобно опуская 01IO). С 64-битным номером и 5-битным/кодом (кроме последнего) вы получаете 13-символьный пул для использования для идентификации пользователя. Вы можете наложить его на 2 случайных символа, чтобы получить 3 группы по 5 символов, если хотите.

Сделайте идентификатор и пустую часть URL-адреса входа. Проверьте значение пули, хранящегося с идентификатором в базе данных, чтобы убедиться, что они одинаковы. Я думаю, что для большинства целей это было бы достаточно большим значением, чтобы было чрезвычайно сложно угадать - число случайное в конце концов - какой slug идет с каким идентификатором пользователя.Используя криптографически сильный генератор случайных чисел, я бы подумал, что маловероятно, что вы даже получите повторные номера для любого из ваших пользователей.

Это может выглядеть следующим образом:

http://example.com/activate?userid=bgates&validate=GY45M-RHQBN-32GYM 

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

+0

Очень хорошая точка в том, что хэши можно «перепроектировать». И если вы действительно обеспокоены тем, что люди угадывают случайные числа, добавьте в него некоторую защиту, которая удалит их учетную запись, если они попытаются аутентифицироваться с неправильным токеном 10 раз или что-то в этом роде. Тогда практически невозможно выдать себя за другого. –

+0

Если вам действительно нужно использовать хэш на основе «известных значений», вы можете соединить хэш, что делает его чрезвычайно трудно угадать. Например. sha1 ("6b34ff3b93d0ebd46d3e". $ username. "8ca97cf1ae342d340f26"). Конечно, если соль просочилась, тогда вы будете. Но да, лучше создать случайное значение, не связанное с информацией пользователя, и сохранить это случайное значение в базе данных. – dirtside

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