id: Гость   вход   регистрация
текущее время 10:49 02/05/2024
Владелец: Alex_B редакция от 09/03/2007 21:27 (автор: SATtva) Печать
https://www.pgpru.com/Разработки/HttpАвторизация
создать
просмотр
редакции
ссылки

Это старая редакция страницы Разработки / Http Авторизация за 09/03/2007 21:27.


Протокол http авторизации


Предлагаю реализацию протокола, идею которого предложил SATtva.
Ознакомиться с оригинальной идеей можно здесь "Защита HTTP-авторизации без SSL?".


Возможно, я частично продублирую изложенный в указанной статье материал. И все же это необходимо сделать для лучшего описания реализации протокола.


Так же есть реализация для "CMS Joomla!", доступна по адресу http://joomlaforum.ru/index.php/topic,11428.0.html

Условные обозначения


A – пользователь.
B – сервер.


u – идентификатор (имя) пользователя.
p – пароль пользователя.
p_h – хеш пароля.
p6 – хеш пароля хранимый в base.txt.
ip1 – ip-адрес определенный сервером на 1 этапе протокола.
ip4 – ip-адрес определенный сервером на 4 этапе протокола.
k – секретный показатель, известный только B.
t1 – метка времени начала исполнения протокола.
H() – операция хеширования.

Описание сценариев и файлов


initialization.php – страница инициализации протокола.
form.html – форма для ввода имени имени и пароля.
webtoolkit.md5.js – java-скрипт клиентской стороны.
login.php – сценарий обработки формы для ввода имени и пароля.
validate.php – сценарий проверки имени и пароля по базе данных (base.txt).
base.txt – файл с зарегистрированными пользователями и их паролями (пароли в хешированном виде).
config.php – конфигурационный файл.

initialization.php

В момент открытия этой страницы пользователем A происходит инициализация протокола.
Еще до загрузки формы для ввода имени и пароля (form.html) этот сценарий проделывает следующие операции:


  1. открывает гостевую сессию со следующими параметрами:
    • ip-адрес пользователя;
    • временная метка начала протокола;
  2. генерирует r=H(k, t1, ip1);

Далее, когда все необходимые операции проведены, на клиентскую сторону передается java-скрипт webtoolkit.md5.js и форма form.html.
Форма, помимо полей для ввода и кнопки, содержит скрытое поле r_type, в которое записывается сгенерированное сервером r.


  1. передача на сторону клиента form.html и webtoolkit.md5.js;

Теперь A видит форму и может ввести u и p.

webtoolkit.md5.js

Загруженный клиенту webtoolkit.md5.js перехватывает событие нажатия кнопки.


  1. При нажатии кнопки берет значения полей p_type (пароль) и r_type.
  2. Вычисляет p_h=H(u).

Операция H(u) производится т.к. в базе паролей на сервере (base.txt) хранятся не сами пароли, а их хешированные значения.
Возможно это бесполезный "наворот", т.к. в этом случаи получается, что роль паролей играют их хешированные значения.
Т.е. пользователь мог бы вводить как пароль значение хеша (идентичного хранимому в base.txt) и тогда операцию H(u) можно было бы не производить.
Однако в этом случаи все пароли должны были бы быть длинной 128 бит.(если используется md5)
(Дайджест любого сообщения прошедшего md5 имеет длину 128 бит)


  1. Вычисляет h=H(r, p_h, p). Записывает h в r_type.
  2. Очищает поле в которое введен пароль p_type.
  3. Отправляет форму (возвращает событие).

Теперь начинается следующий этап протокола (в статье "Защита HTTP-авторизации без SSL?" 4 этап).

login.php

  1. сценарий проверяет, стартовала ли гостевая сессия, если да то исполнение сценария продолжается;
  2. берет из переменных сессии t1';
  3. определяет интервал между текущим временем и временем начала использования протокола. Если интервал не превышен, исполнение протокола продолжается;
  4. В отправленной форме сценарий получает u.

Сценарий login.php передает идентификатор пользователя (u)сценарию проверки имени и пароля по базе данных validate.php.


  1. Если validate.php возвращает не 0, то определяет ip4.
  2. Вычисляет h'=H(H(k, t1, ip4), u4, p6).
  3. Сравнивает значения h и h'
  4. Если значения совпали присваивает A идентификатор авторизованной сессии sid'.

initialization.php


form.html


login.php


webtoolkit.md5.js


validate.php


config.php


base.txt