Проблема
Не секрет, что если не используется 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 функции на яваскрипте
Как сделать страничку с доступом по паролю что бы пароль был введён звёздочками и при не верном вводе перенаправлял на другую страницу....