2016-09-02 1 views
0

Возможно, это лучший вопрос для the Security SE, но я полагаю, что это не было бы неплохим местом, чтобы спросить об этом.Отправка одноразового пароля по почте

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

Избиратели все получают присваивается довольно непредсказуемый имя, по крайней мере, 4 случайных чисел (по РНР random_int() и совершенно непредсказуемой пароль (по РНР random_bytes().

клиент хочет отправить имя пользователя и пароль каждого избирателя (иногда до 5 000 разных людей) по электронной почте. Я не большой фанат, но это для меня или нет. Электронная почта отправляется через SSL, так что, по крайней мере, это что-то.

Я думал, что, поскольку избиратели только один раз голосовать, я могу деактивировать их учетные записи сразу же после их голосования. Вход снова с теми же учетными данными wo тогда не работает. Кроме того, я мог менять свой пароль каждые 24 часа и отправлять избирателей, которые еще не проголосовали за новое письмо с обновленными учетными данными. Выборы обычно длится 3-5 дней, поэтому эти обновленные электронные письма будут автоматически выступать в качестве напоминания о голосовании. Когда выборы закрываются, все связанные аккаунты также будут дезактивированы.

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

ПРИМЕЧАНИЕ: все сгенерированные пароли проходят bcrypt(), прежде чем они будут сохранены в базе данных. Письмо отправляется сразу после создания пароля, и на самом деле это единственный раз, когда пароль можно просматривать в текстовом формате (хотя через SSL, для чего это стоит).

+3

Если вы отправляете уникальный URL-адрес с токеном, зачем нужна форма для создания пароля? Как вы сказали, они не регистрируются повторно для полной учетной записи пользователя как таковой, им просто разрешено выполнять одноразовое действие, а затем заблокированную учетную запись. Так вы не можете просто отправить URL-адрес и после голосования, истечь URL? Создайте токен для URL, используя некоторые уникальные идентификаторы, такие как идентификатор пользователя и что-то случайное, запустите его с помощью сильного алгоритма хэширования, такого как bcrypt. – BadHorsie

+0

Должен ли я по-прежнему отправлять имя пользователя и пароль вместе с этим URL-адресом? Этот пакет выглядит прилично для работы https://github.com/spatie/laravel-url-signer – Loek

+0

Нет, вам не нужно имя пользователя или пароль. Просто уникальный безопасный хэш, который хранится с записью пользователя. – BadHorsie

ответ

2

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

Если выше правильно, вы можете просто сохранить адрес электронной почты вместе со случайным токеном. Маркер может быть отправлен как часть URL-адреса пользователю. Когда пользователь нажимает на ссылку, вы можете проверить, существует ли этот токен, и после завершения выборов вы можете удалить e-mail/токен. Это не требует имени пользователя и пароля.

Токен должен быть достаточно сильным (не менее 20 символов az AZ 0-9), и только его хэш должен храниться в базе данных, хотя если токен достаточно сильный, вы можете использовать быстрый хеш, такой как SHA-256 без соления, поэтому вы можете найти его в базе данных.

+0

Хм, запись избирателя необязательно должна быть связана с записью пользователя.Пока избирательная запись связана с выборами, все в порядке. Это действительно может быть удивительным решением, спасибо! – Loek

+1

@Loek Это именно то, о чем я говорил. – BadHorsie

+0

Я так много думал, спасибо вам обоим! – Loek