Книга Компьютерные сети. 6-е изд. - Эндрю Таненбаум
Шрифт:
Интервал:
Закладка:
Итак, новый протокол аутентификации показан на илл. 8.33 (Берд и др.; Bird et al., 1993). В нем используется код аутентификации сообщения на основе хеширования (Hashed Message Authentication Code, HMAC), гарантирующий целостность и подлинность сообщения. Простой и в то же время мощный код HMAC состоит из хеша на основе сообщения и общего ключа. Отправка HMAC вместе с сообщением не позволяет злоумышленнику изменить или подделать данные: смена любого бита приведет к неправильному хешу. Кроме того, сгенерировать корректный хеш невозможно, не располагая ключом. Коды HMAC привлекательны тем, что их можно очень эффективно генерировать (быстрее по сравнению с выполнением алгоритма SHA-2 с последующим применением к результатам алгоритма RSA).
Илл. 8.33. Аутентификация с применением кодов HMAC
Для начала Алиса отправляет Бобу случайно выбранное число RA (сообщение 1). Такие случайно выбранные числа, которые применяются в протоколах безопасности только один раз, принято называть нонсами (nonce); это сокращение от английского выражения «number used once» — «однократно используемое число». Боб при ответе выбирает собственный нонс RB и высылает его вместе с кодом HMAC. Этот код формируется путем построения структуры данных, состоящей из нонсов Алисы и Боба, их идентификаторов, а также общего секретного ключа KAB. Затем вся эта структура с помощью хеш-функции (например, SHA-2) помещается в HMAC. После приема сообщения 2 у Алисы имеется значение RA (она сама его выбрала), значение RB, полученное в виде открытого текста, два идентификатора и секретный ключ KAB, который она и так знала. С помощью этих данных она может вычислить HMAC самостоятельно. Если он совпадает с кодом HMAC в сообщении, она убеждается, что говорит с Бобом. Ведь Труди не знает KAB и, следовательно, не может угадать HMAC, который следует отослать. Алиса отправляет Бобу HMAC, содержащий только два нонса.
Вопрос: может ли Труди взломать такой протокол? Нет, поскольку она не может заставить ни одну из сторон зашифровать или хешировать выбранное ею значение, как было показано на илл. 8.31 и 8.32. Оба кода HMAC содержат значения, выбранные отправителем, и Труди не способна их контролировать.
Коды HMAC — далеко не единственный вариант применения этой идеи. Довольно распространенная альтернативная схема заключается в шифровании элементов данных последовательно, с помощью сцепления блоков шифра.
8.9.2. Установка общего ключа: протокол обмена ключами Диффи — Хеллмана
До сих пор мы подразумевали, что у Алисы и Боба есть общий секретный ключ. Теперь предположим, что такого ключа нет (поскольку до сих пор не разработана универсальная инфраструктура PKI для создания подписей и распространения сертификатов). Как же его установить? Алиса может позвонить Бобу и передать ключ по телефону, но Боб, скорее всего, спросит: «Как вы докажете, что вы — Алиса, а не Труди?» Можно попытаться организовать встречу, на которую каждый придет с паспортом, водительскими правами и тремя кредитными картами. Однако, будучи занятыми людьми, Алиса и Боб могут месяцами искать удобную дату. К счастью, совершенно незнакомые люди могут установить общий секретный ключ среди бела дня, даже если злоумышленник старательно записывает каждое сообщение.
Протокол, позволяющий устанавливать общий секретный ключ людям, которые друг друга не знают, называется протоколом обмена ключами Диффи — Хеллмана (Diffie — Hellman key exchange) (Diffie and Hellman, 1976). Он работает следующим образом. Алиса и Боб договариваются о двух больших простых числах, n и g, где (n – 1)/2 также является простым числом, кроме того, на число g накладываются некоторые дополнительные ограничения. Эти числа могут быть публичными, поэтому каждый просто устанавливает значения n и g и открыто сообщает о них собеседнику. Затем Алиса выбирает большое (например, двоичное 1024-разрядное) число x и держит его в тайне. Аналогично, Боб выбирает большое секретное число y.
Алиса запускает протокол обмена ключами, отправив Бобу сообщение (открытым текстом), содержащее (n, g, gx mod n), как показано на илл. 8.34. Боб отвечает ей сообщением, содержащим gy mod n. Алиса возводит присланное Бобом число в степень x и делит его по модулю на n, получая (gy mod n)x mod n. Боб выполняет аналогичные вычисления и получает (gx mod n)y mod n. Согласно законам модульной арифметики, оба вычисления должны быть равны gxy mod n. Таким образом, как по мановению волшебной палочки, у Алисы и Боба появляется общий секретный ключ gxy mod n.
Илл. 8.34. Протокол обмена ключами Диффи — Хеллмана
Конечно, Труди видит оба сообщения. Ей известны значения g и n из первого сообщения. Если бы она могла вычислить значения x и y, ей бы удалось получить секретный ключ. Беда в том, что, зная только gx mod n, найти значение x очень трудно. На сегодняшний день неизвестен алгоритм вычисления дискретного логарифма модуля очень большого простого числа.
Для примера возьмем значения n = 47 и g = 3 (абсолютно нереалистичные). Алиса выбирает значение x = 8, а Боб — y = 10. Эти числа хранятся в секрете. Сообщение Алисы Бобу содержит числа (47, 3, 28), так как 38 mod 47 = 28. Боб отвечает Алисе числом 17. Алиса вычисляет 178 mod 47 и получает 4. Боб считает 2810 mod 47 и тоже получает 4. Таким образом, независимо друг от друга, Алиса и Боб определили, что значение секретного ключа равно 4. Чтобы найти ключ, Труди придется решить уравнение 3x mod 47 = 28. Это можно сделать путем полного перебора при использовании небольших чисел, но не в случае чисел длиной в несколько сотен битов. Сегодня все известные алгоритмы требуют для этого вычисления гигантских временных затрат, даже при использовании сверхбыстрых суперкомпьютеров с десятками миллионов ядер.
Несмотря на всю элегантность алгоритма Диффи — Хеллмана, есть одна проблема: когда Боб получит три числа (47, 3, 28), как удостовериться в том, что их отправила Алиса, а не Труди? Нет никакого способа узнать это. К сожалению, Труди может воспользоваться этим, чтобы обмануть Алису и Боба (илл. 8.35). Пока Алиса и Боб устанавливают значения