Код активации аккаунта - использовать хэш пароля?

Placido

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

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
хэш должен быть уникальным, как ты этого добьешься - дело твое.

PS: хеш пароля все же не стоит делать. Либо делать хэш пароля+соль+ххх, если уж совсем хочется туда засунуть пароль.
 

Placido

Наблюдаю
Спасибо за ответ. Да, соль добавлю. А какие еще есть варианты? Генерировать случайный код? Тогда где его хранить, создавать дополнительное поле под него в таблице с данными пользователей? Или в отдельную таблицу id пользователя - код? В случае с использованием в качестве кода хэша пароля эти вопросы отпадают сами собой.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Я для активации/забытого пароля/кук автовхода делаю обычно
PHP:
sha1(uniqid('', true))
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Спасибо за ответ. Да, соль добавлю. А какие еще есть варианты? Генерировать случайный код? Тогда где его хранить, создавать дополнительное поле под него в таблице с данными пользователей? Или в отдельную таблицу id пользователя - код? В случае с использованием в качестве кода хэша пароля эти вопросы отпадают сами собой.
Я например, в ссылке не передаю никаких других данных, кроме самого кода, поэтому для него нужно поле. В твоем случае, помимо самого кода активации, нужно будет передавать идентификатор пользователя.
 

SiZE

Новичок
В IPB используется отдельная таблица куда заносится информация о пользователе, который должен идентифицироваться. Для идентификации используется случайная, уникальная строка.
PHP:
function randString ( $length=32 ) {
	return substr( sha1( uniqid( rand(),true ) ),0,$length );
}
 

scorpion-ds

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

После регистрации в случае необходимости генерируется код (с паролем он ни как не связан), которые добавляется в БД (+ информация что должен делать этот код) и отправляется пользователю на почту. Когда пользователь переходит по ссылке с кодом, CMS распознает код и задачу которая в "нем заложена" к примеру активация аккаута. Таким же образом происходит авторизация по ссылке из письма, после использования ссылка становится недействительной.
 

Placido

Наблюдаю
Большое спасибо за ответы. Сделал так.

В таблицу с пользователями добавил два поля `hash` и `hashexpire`.
В поле `hash` при регистрации вношу случайный хэш (md5(uniqid($user->login,true))), в `hashexpire` - time() + 48 часов. При активации в поле `active` ставлю "1" ("0" - по умолчанию), в `hashexpire` - NULL (хотя, значение в этом поле после активации уже не принципиально).

Этот же хэш использую для автоматического логина.
При входе пользователя на сайт проверяю, есть ли в куке или в сессии хэш, если есть, вытаскиваю из таблицы `users` соответствующего пользователя, в поле `hash` вношу новый хэш, его же записываю в сессию. Если стоит флажок "Запомнить меня", отправляю соответствующую куку с хэшем и временем жизни time() + месяц, если флажка нет - куку с временем жизни time() - 3600.
 

scorpion-ds

Новичок
Placido
Рабочее решение, я так делал в первой версии "активации аккаунта", сейчас же хэши хранятся у меня в отдельной таблице, так как для 1 пользователя таких кодов может быть N, к примеру у меня в уведомлениях приходя ссылки для быстрого входа и таких писем может быть несколько в день, кроме того в моем случае каждый хэш может отвечать еще и за какую-то команду.
 
Сверху