Частично защищенная авторизация с использованием Javascript MD5 функции

Главные вкладки

Аватар пользователя inc inc 29 октября 2007 в 14:52

Проблема

Не секрет, что если не используется 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'у:

  1. Сервер генерирует и сохраняет в сессии случайное число или
    случайную фразу (challenge), и отправляет его клиенту в виде скрытого поля (input type=hidden)
    в форме авторизации.
  2. Клиент, после ввода пользователем login'а и password'а, возвращает на Сервер login
    и пустой password, а также значение
    MD5(challenge + MD5(password))
  3. Сервер вычисляет для полученного login'а значение
    MD5([сохраненный в сессии challenge] + [сохраненный в базе данных хеш password])

    и
    сравнивает его с возвращенным значением клиента.

Преимущества и недостатки схемы

Преимущества

  1. Пароль не передается открытым текстом, а значит не может быть перехвачен пассивным
    "слушателем" пакетов (тем, кто просто "слушает" всех подряд и не ставит перед собой
    цели получить данные какого-то конкретного пользователя).
  2. В случае перехвата хеша от клиента, его нельзя будет использовать второй раз (в отличие от пароля),
    благодаря использованию случайного поля challenge.

Недостатки (по нарастанию серьезности)

  1. Реализация MD5 на Javascript малоэффективна, следствие - большие вычислительные затраты.
  2. Поддержка UTF-8 в javascript MD5 функции на момент написания статьи находится только на альфа стадии
    (начальный этап реализации, до тестирования и исправления ошибок).
  3. Если в браузере клиента отключен Javascript, то авторизация должна проходить как раньше,
    то есть пароль опять будет возвращен открытым текстом.
  4. При смене пароля пользователем, новый пароль опять будет возвращен открытым текстом.
  5. Использование приведенной выше схемы рушит механизм сокрытия пароля в базе данных,
    поскольку хеш пароля по сути сам становится паролем.
  6. Если посредник между Клиентом и Сервером может не только "слушать", но и изменять
    проходящие пакеты, то он может изменить Javascript, отправляемый клиенту, чтобы тот
    всегда возвращал пароль открытым текстом.
  7. Наконец, если "слушатель" не пассивен и ему нужны данные какого-то конкретного пользователя,
    то он может просто перехватить идентификатор сессии этого пользователя, а дальше установить нужный ему
    пароль стандартными средствами.

Выводы

Очевидно, схема имеет больше недостатков, чем преимуществ, именно поэтому она до сих пор
не внедрена в ядро Drupal, хотя попытки сделать модуль уже были для Drupal 4.5. Существует модуль
для Drupal 5: CRAM.
Однако, в немного другой форме эта схема используется в PHPLib, PHPMyAdmin, а также на некоторых
сервисах Yahoo(по сведениям с Drupal.org).
По-настоящему защищенную авторизацию может обеспечить только зашифрованное соединение (SSL).

Ссылки

  1. Реализация MD5 для javascript, сделанная Полом Джонстоном(Paul Johnston)(eng.)
    http://pajhome.org.uk/crypt/md5/index.html
  2. Мысли Пола Джонстона о применении его скрипта(eng.)
    http://pajhome.org.uk/crypt/md5/auth.html
  3. Модуль CRAM для Drupal 5
    http://drupal.org/project/cram
  4. Статья "Защищенная авторизация (сессии+javascript)"(рус.)
    http://php.com.ua/ru/articles/security/safe_auth.htm
  5. Цикл статей "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/
  6. Обсуждение проблемы и ее решения на 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
  7. Описание реализации Challenge-Response Authentication в PHPLib(eng.)
    http://www.sanisoft.com/phplib/manual/auth_Response.php

Комментарии

Аватар пользователя inc inc 29 октября 2007 в 14:53

Сильно не бейте, если что не так: материал собран за вечер, я
до конца не вылечился от сильной простуды.

Аватар пользователя coyotle coyotle 30 октября 2007 в 13:57

а что-нибудь по авторизации через SSL есть, как это сделать?
P.S. Можно конечно все пустить через SSL, но это как-то не правильно...

Аватар пользователя coyotle coyotle 7 декабря 2007 в 10:29

Нашелся модуль Secure Login - позволяет организовать защищенную авторизацию перенаправляя введенные данные на SSL адрес сайта.
Также можно включить защиту для отправки форм с профилем пользователя и регистрации.

Аватар пользователя Baloo Baloo 12 августа 2008 в 14:22

Как сделать страничку с доступом по паролю что бы пароль был введён звёздочками и при не верном вводе перенаправлял на другую страницу....