Добрый день всем.
Сейчас пишу код для аутентификации и авторизации пользователей на сайте на php.
Выглядит оно так:
пользователь вводит логин\пароль, скрипт на сервере дергает базу, запросом выполняется проверка на наличие пользователя & md5( от этого пароля). Если есть такая комбинация логина и md5 от пароля, - значит все ок.
Так вот на странице (в панели управления) есть код работающий черех xmlhttp (ajax)
При каждом таком запросе нужно дергать базу.
Вот в этом и проблема.
Не хочется мучать ее величество такими мелкими проверками на валидность.
Можно ли обойтись БЕЗ базы ?
Нет, классические сессии не предлагать. (Их много, они неправильно очищаются, fs, inode и т.д.)
memcache и прочее дополнительно ПО ради этого тоже ставить не хочется.
Есть вариант.
Сам метод аутентификации не менять, (при логине базу дергать придется)
а вот авторизацию:
возможно ли обойтись только математикой ?
Вот например по алгоритму Диффи-Хеллмана (понимаю как работает генерация секретного ключа, но не понимаю как авторизировать пользователей, оссобенно с общими g, p)
или что-то типа такого :
пользователь обладает паролем (md5) и солью
посылает его на сервер,
сервер на основе вышеописанных данных вычисляет секретное число
secretkey + (login,pass,salt) = some_num
А при авторизации сервер проделывает обратную операцию. Получается таже сессия но без хранения чего-либо на сервере.
Есть ли такие методы ?
Кто либо их применял?
Какие недостатки помимо хранения всего этого в cookie в открытом виде ?
Любые мысли на этот счет ?
Будет ли быстрее, либо postgres не так уж и плох для множества запросов
P.P.S. Уточню: Мы не говорим о непосредственно перехвате кук и их открытого хранения.
А только о
а) безопасности решения
б) отсутствии коллизий
т.е. чтобы пользователь A не оказался случайно пользователем B.
1. Симметричные алгоритмы: Тут, как сказал ScorpLeX зная функцию можно залогиниться под любым пользователем
2. Ассиметричные: когда зная функцию это ровным счетом ничего не дает, т.к. неизвестен закрытый ключ который хранится на клиенте. (опять же о перехвате его мы НЕ говорим)
Так можно ли применить ассиметрию при авторизации, основанную на одном общем ключе (общем - потому что если он будет личным для каждого, то его нужно будет хранить (в сессии\базе) а от этого как раз хочется уйти), особенно в php ( ведь ассиметричные алгоритмы не быстрые, + требуют больших чисел при небольшом количестве клиентов) Немного сумбурно и "от себя" но объяснил как мог. Надеюсь вы меня поняли
Обратную операцию тут не сделаешь.
Если я правильно понял, алгоритм примерно такой:
Клиент запрашивает авторизацию имея логин и пароль.
Сервер проверяет если такой логин\пароль и генерирует на основе зашитой в скрипт secretkey некий хэш md5(secretkey + login + pass) и его отдает клиенту.
Клиент опять конектится на сервер имея еще и хэш, сервер делает md5(secretkey + login + pass) и сравнивает с присланным от клиента хэшем.
Если правильно, считает что он авторизован.
Тут конечно узкое место это зашитый secretkey, узнав который можно залогинится под любым пользователем. Подобрать его будет просто, но нужно знать логин\пароль\хэш\алгоритм.
PS используйте лучше базу, если не доверяете сессиям. И в куках лучше хранить токен, сгенерированный при авторизации пользователя и сверять с ним.