Проблема
Не секрет, что если не используется SSL, то при авторизации пользователей на сайте через форму,
поля login и password передаются открытым текстом.
А значит, если есть в цепи передачи пакетов кто-то "слушает" проходящий трафик, то
он может свободно извлечь имя и пароль пользователя. Это может быть особенно опасно, если пользователь
использует один и тот же пароль для доступа к нескольким ресурсам.
Решение с использованием Javascript MD5 функции
Про MD5
MD5 - это необратимый алгоритм шифрования (хеширования).
Пароли в базе данных сайта на Drupal хранятся именно в виде
MD5 хешей. Даже если злоумышленник каким-то образом прочитает
этот хеш из базы данных, он не сможет расшифровать
пароль.
Одна из реализаций MD5 для javascript, сделанная
Полом Джонстоном(Paul Johnston), свободно доступна здесь:
http://pajhome.org.uk/crypt/md5/index.html
Схема работы авторизации
Существует несколько вариантов применения MD5 javascript функции к решению
обозначенной проблемы.
В англоязычных источниках эти схемы именуются
Challenge-Response Authentication или CHAP(Challenge Handshake Authentication Protocol)
login system.
Рассмотрим вариант реализации, который можно применить к Drupal'у:
- Сервер генерирует и сохраняет в сессии случайное число или
случайную фразу (challenge), и отправляет его клиенту в виде скрытого поля (input type=hidden)
в форме авторизации. - Клиент, после ввода пользователем login'а и password'а, возвращает на Сервер login
и пустой password, а также значениеMD5(challenge + MD5(password))
- Сервер вычисляет для полученного login'а значение
MD5([сохраненный в сессии challenge] + [сохраненный в базе данных хеш password])
и
сравнивает его с возвращенным значением клиента.
Преимущества и недостатки схемы
Преимущества
- Пароль не передается открытым текстом, а значит не может быть перехвачен пассивным
"слушателем" пакетов (тем, кто просто "слушает" всех подряд и не ставит перед собой
цели получить данные какого-то конкретного пользователя). - В случае перехвата хеша от клиента, его нельзя будет использовать второй раз (в отличие от пароля),
благодаря использованию случайного поля challenge.
Недостатки (по нарастанию серьезности)
- Реализация MD5 на Javascript малоэффективна, следствие - большие вычислительные затраты.
- Поддержка UTF-8 в javascript MD5 функции на момент написания статьи находится только на альфа стадии
(начальный этап реализации, до тестирования и исправления ошибок). - Если в браузере клиента отключен Javascript, то авторизация должна проходить как раньше,
то есть пароль опять будет возвращен открытым текстом. - При смене пароля пользователем, новый пароль опять будет возвращен открытым текстом.
- Использование приведенной выше схемы рушит механизм сокрытия пароля в базе данных,
поскольку хеш пароля по сути сам становится паролем. - Если посредник между Клиентом и Сервером может не только "слушать", но и изменять
проходящие пакеты, то он может изменить Javascript, отправляемый клиенту, чтобы тот
всегда возвращал пароль открытым текстом. - Наконец, если "слушатель" не пассивен и ему нужны данные какого-то конкретного пользователя,
то он может просто перехватить идентификатор сессии этого пользователя, а дальше установить нужный ему
пароль стандартными средствами.
Выводы
Очевидно, схема имеет больше недостатков, чем преимуществ, именно поэтому она до сих пор
не внедрена в ядро Drupal, хотя попытки сделать модуль уже были для Drupal 4.5. Существует модуль
для Drupal 5: CRAM.
Однако, в немного другой форме эта схема используется в PHPLib, PHPMyAdmin, а также на некоторых
сервисах Yahoo(по сведениям с Drupal.org).
По-настоящему защищенную авторизацию может обеспечить только зашифрованное соединение (SSL).
Ссылки
- Реализация MD5 для javascript, сделанная Полом Джонстоном(Paul Johnston)(eng.)
http://pajhome.org.uk/crypt/md5/index.html - Мысли Пола Джонстона о применении его скрипта(eng.)
http://pajhome.org.uk/crypt/md5/auth.html - Модуль CRAM для Drupal 5
http://drupal.org/project/cram - Статья "Защищенная авторизация (сессии+javascript)"(рус.)
http://php.com.ua/ru/articles/security/safe_auth.htm - Цикл статей "Building a CHAP Login System", написанный Alejandro Gervasio(eng.)
http://www.devarticles.com/c/a/JavaScript/Building-a-CHAP-Login-System-Encrypting-Data-in-the-Client/
http://www.devarticles.com/c/a/JavaScript/Building-a-CHAP-Login-System-Coding-ServerSide-Random-Seeds/
http://www.devarticles.com/c/a/JavaScript/Building-a-CHAP-Login-System-An-ObjectOriented-Approach/ - Обсуждение проблемы и ее решения на Drupal.org(eng.)
http://drupal.org/node/36793
http://drupal.org/node/138149
http://drupal.org/node/13231
http://drupal.org/node/13240
http://drupal.org/node/1577 - Описание реализации Challenge-Response Authentication в PHPLib(eng.)
http://www.sanisoft.com/phplib/manual/auth_Response.php
Комментарии
Сильно не бейте, если что не так: материал собран за вечер, я
до конца не вылечился от сильной простуды.
а что-нибудь по авторизации через SSL есть, как это сделать?
P.S. Можно конечно все пустить через SSL, но это как-то не правильно...
http://drupal.org/node/13231
хорошая статейка возьму на заметку
Нашелся модуль Secure Login - позволяет организовать защищенную авторизацию перенаправляя введенные данные на SSL адрес сайта.
Также можно включить защиту для отправки форм с профилем пользователя и регистрации.
Появился модуль для Drupal 5: http://drupal.org/project/cram
А этот cram, у кого нибудь работает?
А имеется ли хоть где-нибудь реализация md5 функции?
Я имел ввиду реализацию md5 функции на яваскрипте
Как сделать страничку с доступом по паролю что бы пароль был введён звёздочками и при не верном вводе перенаправлял на другую страницу....