Попробуем разобраться
Для начала, определим участников:
Код:
Алиса - первый участник, в нашем случае - пользователь
Боб - второй участник, сервер
Мэллори - злоумышленник
Итак, первый протокол:
Код:
Переменные:
sess_id - идентификатор сессии
check - процедура проверки данных
Протокол:
Алиса Боб
------- -----
name, pass =>
check(name, pass)
<= sess_id
sess_id =>
check(sess_id)
<= data
Несложно заметить, что данные проверяются только в первый раз, после чего безопасность протокола основана только на
идентификаторе сессии (sess_id).
Насколько надёжен такой подход? По умолчанию, размер sess_id - 128 бит, а значит, чтобы найти его методом перебора, понадобится около 2^128 взаимодействий с удалённой системой. Это не кажется очень реалистичным.
С другой стороны, если sess_id станет известен Мэллори, он сможет отправлять и получать сообщения от имени Алисы.
Перейдём ко второму протоколу:
Код:
Новые переменные:
session - данные сессии
salt - случайная соль
Протокол:
Алиса Боб
------- -----
name, pass, user_agent =>
check(name, pass)
salt = random()
session.hash = md5(concat(user_agent, salt))
<= sess_id
sess_id, user_agent =>
check(sess_id, session.hash)
<= data
Теперь, казалось бы, надёжность должна значительно повыситься, и даже при компрометации sess_id система останется безопасной.
Но рассмотрим то, как осуществляется проверка.
При каждом запросе Алиса будет отсылать sess_id, которому соответствует некий набор данных на сервере - session. Чтобы проверить, действительно ли это её сессия, необходимо вычислить хэш и сравнить его с сохранённым.
Для этого, в свою очередь, нужно получить ту самую соль, которая была использована при авторизации. Проблема в том, что единственное, что связывает "ту" Алису и "эту" и говорит, какую соль использовать - это sess_id. Замкнутый круг.
Зачем же здесь тогда функция md5 и соль, если они не обеспечивают дополнительную проверку?
Очевидно, что хэширующая функция не даёт узнать начальное значение, а соль мешает эффективно использовать атаку по словарю, но... если у Мэллори есть права на чтение и ему удалось прочитать файл сессии, то атаковать хэш ему уже не понадобится.