Показать сообщение отдельно

  #4  
Старый 28.01.2009, 05:29
astrologer
Постоянный
Регистрация: 30.08.2007
Сообщений: 773
Провел на форуме:
3069349

Репутация: 808


По умолчанию

Попробуем разобраться

Для начала, определим участников:
Код:
    Алиса   - первый участник, в нашем случае - пользователь
    Боб     - второй участник, сервер
    Мэллори - злоумышленник
Итак, первый протокол:
Код:
  Переменные:
  
    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 и соль, если они не обеспечивают дополнительную проверку?

Очевидно, что хэширующая функция не даёт узнать начальное значение, а соль мешает эффективно использовать атаку по словарю, но... если у Мэллори есть права на чтение и ему удалось прочитать файл сессии, то атаковать хэш ему уже не понадобится.
 
Ответить с цитированием