Собеседование for fun

Какое-то время назад обновлял резюме на hh, провисело пару дней, звонки, все дела. Сегодня чел из какой-то рекрутинговой компании предложил очередную студию — надо было пройти тест :D Все цивильно сделано, логин\пароль, время 40 минут.

Самое интересное — «усложненное», по их словам, задание после теста:

Доп. Задача — как раз усложнение задачи про восстановление пароля, дополнительные условия:

1. На запрос восстановления пароля никакой промежуточной информации
никуда писать нельзя,
только генерируем ссылку и отправляем письмо.
2. Ссылка должна иметь срок жизни сутки.
3. Ссылка должна быть валидна только для данного пароля и емэйла,
Как будет выглядеть ссылка на восстановление пароля.

Скажу честно, призадумался. Ясно, что URL должен быть функцией от 3х указанных переменных, но как защитить более-менее надежно от их изменения я придумал не сразу. Вот мое решение:

$time = time();
$pass_hash = sha1( $pass );
$hash = sha1( $mail . $pass_hash . $time );

$url = 'http://site.com/pass_restore.php?mail='. $mail .'&pass='. $pass_hash .'&date='. $time .'&hash='. $hash;

Фишка в том, что на первый взгляд глупое требование не хранить ничего на стороне сервера заставляет думать, как же не гонять пароль в открытом виде по сети и в то же время в случае подтверждения иметь возможность сохранить его в базу. Я использовал хэширование. BlackRabbit предложил симметричное шифрование, но сходу я не припомнил встроенных средств для оного в PHP. Была мысль про XOR, но я от нее ушел ;)

Вообще было приятно отвлечься от дурацкого неудобного TCL и размять мозги. Спасибо им :D Но в студию я вряд ли пойду, т.к. не считаю себя достаточно подготовленным.

Запись опубликована в рубрике PHP, Web Application Security с метками . Добавьте в закладки постоянную ссылку.

Один комментарий на «Собеседование for fun»

  1. Bird говорит:

    nabolt sha1! des(unix) v massi :D

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *