Стратегии для аутентификации пользователей один раз без предварительного идентификатора - PullRequest
6 голосов
/ 06 мая 2009

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

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

Ответы [ 4 ]

10 голосов
/ 06 мая 2009

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

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

3 голосов
/ 06 мая 2009

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

Таким образом, ссылка, которую они получают в письме, выглядит примерно так:

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

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

2 голосов
/ 06 мая 2009

Почему бы просто не назначить случайное 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

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

1 голос
/ 06 мая 2009

Выезд gperf .

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

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

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

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