Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Технологии защиты программного обеспечения > Доступ к серверу по паролю


Автор: Deepthroat 3.12.2007, 01:26
Предлагаю такую задачу, если есть стандартное описанное в литературе решение, или, если эта задача уже где-то решена, ткните, пожалуйста.

Значит так, есть клиент и сервер. Клиент имеет имя пользователя и пароль, по которым он должен обращаться к серверу. На сервере эти данные хранить нельзя, поэтому я храню их хеши (есть возможность использовать md5 или более стойкий SHA-512). Так, взломав сервер, получить пароль пользователя невозможно.

Все бы хорошо, но можно перехватить трафик клиента, а там пароль передается в открытом виде.

Можно использовать схему, в которой сервер дает клиенту случайное число, тот его подписывает (да хоть так: md5(Password + Random)) и отправляет уже подпись. При перехвате трафика пароль узнать не выйдет. Но зато на сервере надо хранить пароль в открытом виде (либо зашифрованный, но ключем, который все равно хранится где-то на сервере в открытом виде). Т.е. при взломе сервера хакер получает пароль.

Работа проходит на PHP и JavaScript, так что выбор криптографических функций несколько ограничен (AES 256, SHA-512, md5).

Можно хранить на сервере пароль в зашифрованном виде, а ключ для шифрования пароля хранить на другом сервере. Но взломав наш сервак, можно получить место хранения ключа и расшифровать им сам пароль. К тому же, иметь 2 сервера - это слишком геморно.

Итак, вопрос: как мне организовать аутентификацию пользователя не храня пароль на сервере и не передавая его в открытом виде?

Автор: SaDFromSpb 3.12.2007, 02:36
Deepthroat, я не особо разбираюсь в этих всяких криптографических штуках, но вроде можно просто шифрованным канал между клиентом и сервером сделать. Либо все соединение через ssl (или что-нибудь там аналогичное - хз) делать, либо только акт передачи пароля, как в gmail'е по умолчанию. Поснифать пассворд на гмэйл не получится, в отличие от многих других мыльных серверов. =)

Автор: Alexandr87 3.12.2007, 05:44
Цитата(Deepthroat @  3.12.2007,  04:26 Найти цитируемый пост)
Можно использовать схему, в которой сервер дает клиенту случайное число, тот его подписывает (да хоть так: md5(Password + Random)) и отправляет уже подпись. При перехвате трафика пароль узнать не выйдет.

угу - пароль узнать не выйдет. Да и не надо. Если есть возможность активно воздействовать на траффик пользователя, можно зайти, используя перехваченную от клиента комбинацию. google man-in-the-middle.

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)