пятница, 17 сентября 2010 г.

ISSP \ Домен 06. Криптография. Часть 5

В этой части рассмотрены следующие вопросы:
  • Целостность сообщения
  • Односторонний хэш
  • HMAC
  • CBC-MAC
  • Различные алгоритмы хэширования
  • MD2
  • MD4
  • MD5
  • SHA
  • HAVAL
  • Tiger
  • Атаки на односторонние функции хэширования
  • Цифровая подпись
  • Стандарт цифровой подписи


Биты четности и функции CRC (Cyclic Redundancy Check - Циклический избыточный код) используются в протоколах для выявления изменений в потоке битов, проходящем от одного компьютера к другому, но обычно они могут выявить только неумышленные изменения. Такие изменения могут произойти из-за перепадов напряжения, помех, затухания сигнала в проводах или других физических причин, вызывающих повреждение битов при их передаче между компьютерами. Биты четности не могут выявить факт перехвата сообщения злоумышленником, его изменения и последующей отправки получателю, т.к. злоумышленник может просто рассчитать новое значение четности и указать его в новом сообщении, и получатель никогда не заметит разницы. Для защиты от такой атаки необходимы алгоритмы хэширования, позволяющие успешно выявлять факты и умышленного, и неумышленного изменения данных. Сейчас мы рассмотрим некоторые алгоритмы хэширования и их характеристики.


Односторонний хэш (one-way hash) – это функция, которая создает строки и сообщения переменной длины, а также значения фиксированной длины, называемые значениями хэша. Например, если Кевину нужно отравить сообщение Марии, и он хочет быть уверенным, что в его сообщение не будут внесены несанкционированные изменения в процессе передачи, он должен рассчитать хэш-значение своего сообщения и добавить его к самому сообщению. Когда Мария получит сообщение, она выполнит такую же функцию хэширования, что и Кевин, и сравнит полученный результат со значением, указанным в сообщении. Если два значения совпадают, Мария может быть уверена, что сообщение не было изменено в процессе передачи. Если два значения отличаются, Мария узнает, что сообщение было изменено умышленно или неумышленно, и уничтожит это сообщение.

Алгоритм хэширования не является секретом – он общеизвестен. Секретность односторонней функции хэширования обеспечивается ее «одностороннестью». Эта функция работает только в прямом направлении, но не в обратном. В этом состоит ее отличие от односторонней функции в криптографии с открытыми ключами, в которой секретность обеспечивается за счет того, что никто не знает «черного хода», а выполнить одностороннюю функцию в обратном направлении, чтобы привести зашифрованное сообщение к читаемому виду, очень сложно. Однако односторонние функции хэширования никогда не выполняются в обратном направлении – получатель не пытается провести обратный процесс, он просто запускает ту же самую функцию хэширования в прямом направлении над тем же самым сообщением, чтобы сравнить результаты.

Односторонняя функция хэширования выполняется без использования каких-либо ключей. Это означает, например, что Черил пишет сообщение, рассчитывает дайджест сообщения, добавляет его к самому сообщению и отправляет сообщение вместе с дайджестом Скотту. Брюс может перехватить это сообщение и изменить его, а затем рассчитать новый дайджест, присоединить новый дайджест к измененному сообщению и отправить Скотту. Когда Скотт получит его, он проверит дайджест сообщения, но так и не узнает, что в действительности сообщение было изменено Брюсом. Скотт будет думать, что сообщение пришло от Черила в неизменном виде, т.к. он сравнил два значения дайджеста (рассчитанное самостоятельно и прикрепленное к сообщению) и они были равны. Если Черилу нужен более высокий уровень защиты, ему нужно использовать код аутентификации сообщения (МАС – Message Authentication Code).

Функция МАС – это схема аутентификации, полученная в результате применения секретного ключа к сообщению. Но это не означает, что используется симметричный ключ для шифрования сообщения.

Вам нужно знать два основных типа МАС: МАС-хэш (НМАС – hash-MAC) и СВС-МАС.


Выше мы рассматривали пример, когда Черил передавал сообщение Скотту. Посмотрим, что изменится, если Черил воспользуется функцией НМАС вместо простого алгоритма хэширования. Перед передачей в алгоритм хэширования к его сообщению прикрепляется симметричный ключ. Затем к исходному сообщению, уже без симметричного ключа, прикрепляется полученное значение МАС и результат отправляется Скотту. Если Брюс перехватит это сообщение и изменит его, он не сможет рассчитать правильное новое значение МАС, поскольку у него нет необходимого симметричного ключа. На Рисунке 6-20 показаны эти шаги.

Рисунок 6-20. Шаги выполнения алгоритма хэширования и функции HMAC

Используемая терминология. Идея функций хэширования очень проста. Вы пропускаете сообщение через хэширующий алгоритм, который вырабатывает хэш-значение. Здесь используется совсем немного терминов.
  • Хэш-значение может также называться дайджестом (digest) или отпечатком (fingerprint) сообщения.
  • Алгоритмы хэширования также называют бесключевыми дайджестами сообщений (nonkeyed message digest).
  • Существует два типа МАС: НМАС (hashed MAC) и СВС-МАС.
  • МАС также иногда называют кодом целостности сообщения (MIC – Message Integrity Code) или кодом выявления изменений (MDC – Modification Detection Code).

Ниже перечислены основные шаги процесса хэширования, показанного на Рисунке 6-20:
  1. Отправитель пропускает сообщение через функцию хэширования.
  2. Генерируется значение дайджеста сообщения.
  3. Дайджест сообщения добавляется к сообщению.
  4. Отправитель отправляет сообщение получателю.
  5. Получатель пропускает сообщение через функцию хэширования.
  6. Получатель генерирует свое собственное значение дайджеста сообщения.
  7. Получатель сверяет два значения дайджеста сообщения. Если они совпадают, сообщение не было изменено.
В нижней части Рисунка 6-20 показаны шаги НМАС:
  1. Отправитель добавляет симметричный ключ к сообщению.
  2. Результат помещается в алгоритм хэширования.
  3. Генерируется значение МАС.
  4. Значение МАС добавляется к сообщению.
  5. Отправитель отправляет сообщение получателю (только сообщение с присоединенным к нему значением МАС, симметричный ключ вместе с сообщением не передается).
  6. Получатель добавляет свою копию симметричного ключа к полученному сообщению.
  7. Получатель пропускает результат через хэширующий алгоритм и генерирует свое собственное значение МАС.
  8. Получатель сравнивает два значения МАС. Если они совпадают, сообщение не было изменено.
Когда мы говорим здесь, что к сообщению добавляется симметричный ключ, мы не подразумеваем, что этот ключ применяется для шифрования сообщения. Функция НМАС не шифрует сообщение, поэтому она не обеспечивает конфиденциальность.

Эта технология требует, чтобы у отправителя и получателя был одинаковый симметричный ключ. Функция НМАС не реализует безопасную передачу симметричного ключа получателю. Для этого применяются другие технологии, которые мы уже обсуждали ранее (алгоритм Диффи-Хеллмана и соглашение о ключах, либо RSA и обмен ключами).


При использовании СВС-МАС, сообщение шифруется симметричным блочным шифром в режиме СВС, а последний блок шифротекста используется в качестве МАС. При этом отправитель не отправляет зашифрованную версию сообщения, он отправляет открытый текст с прикрепленным к нему МАС. Получатель зашифровывает полученный открытый текст таким же симметричным блочным шифром в режиме СВС и независимо рассчитывает свое значение МАС. Затем получатель сравнивает рассчитанное значение МАС со значением в полученном сообщении. Этот метод, в отличие от НМАС, не использует алгоритмов хэширования.

Использование симметричного ключа гарантирует, что целостность сообщения может проверить только человек, обладающий копией этого ключа. Больше проверить это не может никто, и если кто-то перехватит и изменит данные, он не сможет сгенерировать новое значение МАС (НМАС или СВС-МАС) так, чтобы получатель не смог заметить подмены. Любые изменения будут заметны получателю.

Таким образом, получатель знает, что полученное сообщение пришло от отправителя, который имеет другую копию того же симметричного ключа, что обеспечивает возможность для аутентификации источника данных (data origin authentication), иногда называемой аутентификацией системы (system authentication). Это отличается от аутентификации пользователя, которая требует использования закрытого ключа. Закрытый ключ связан с конкретным человеком, а симметричный ключ – нет. Таким образом, МАС-аутентификация обеспечивает слабый вид аутентификации, т.к. аутентифицируется не сам пользователь, а только компьютер или устройство.

ПРИМЕЧАНИЕ. Один и тот же ключ не следует использовать и для аутентификации, и для шифрования.

Как и в большинстве других алгоритмов, в CBC-MAC были найдены некоторые проблемы безопасности, для решения которых был создан CMAC (Cipher-Based Message Authentication Code - Код аутентификации сообщения, основанный на шифровании). CMAC обеспечивает такой же вариант аутентификации источника данных и контроля целостности, как и CBC-MAC, но он более защищен с математической точки зрения. CMAC является одной из разновидностей CBC-MAC, он был одобрен для работы с алгоритмами AES и 3DES. Для выявления изменения данных используется CRC, но контроль целостности выполняется обычно на более низком уровне сетевого стека. Поскольку эти функции работают на более низком уровне сетевого стека, они используются для выявления изменений (повреждений) при передаче сетевых пакетов от одного компьютера другому. HMAC, CBC-MAC и CMAC работают на более высоких уровнях сетевого стека, поэтому могут выявлять не только ошибки передачи (случайные), но и намеренные изменения сообщений злоумышленником для получения собственной выгоды. Таким образом, все эти технологии (за исключением CRC) могут выявить намеренные, несанкционированные изменения, а также случайные, неумышленные изменения.

CMAC работает следующим образом. Симметричный алгоритм (AES или 3DES) создает симметричный ключ. Этот ключ используется для создания суб-ключей. Суб-ключи используются по-отдельности для зашифрования отдельных блоков сообщения, как показано на Рисунке 6-21. Это в точности совпадает с тем, как работает CBC-MAC, но с более сильной магией. Этой магией является сложная математика, однако столь глубоких знаний не требуется для прохождения экзамена CISSP. Чтобы лучше понять эту математическую магию, ознакомьтесь с документом по адресу: http://csrc.nist.gov/publications/nistpubs/800-38B/SP_800-38B.pdf.

Рисунок 6-21. Процесс шифрования блочным шифром в режиме сцепления блоков шифротекста

Хотя углубление в математику CMAC не обязательно для экзамена CISSP, вам нужно знать, что это алгоритм расчета кода аутентификации сообщения, основанный на блочном шифре. Это означает, что он также может обеспечить только аутентификацию источника данных (например, направивший их компьютер), но не человека (реально отправившего их).
Хэши, HMAC, CBC-MAC, CMAC. МАС и процессы хэширования могут показаться сложными. Следующая таблица упрощает понимание различий между ними.




Как было сказано ранее, целью использования односторонних функций хэширования является создание "отпечатка" (хэша) сообщения. Если два различных сообщения дают в результате одинаковое значение хэша, это может упростить атакующему задачу взлома механизма безопасности, поскольку такой шаблон может быть воспроизведен.

Стойкие односторонние функции хэширования не должны давать одинаковое значение хэша для двух и более разных сообщений. Если хэширующий алгоритм дает гарантии создания различных хэшей для двух и более различных сообщений, говорят, что он не подвержен коллизиям (collision free).

Хорошие криптографические функции хэширования должны иметь следующие характеристики:
Хэш должен вычисляться на основе всего сообщения.
Хэширование должно быть односторонним, чтобы сообщение нельзя было восстановить по значению хэша
Не должно существовать двух различных сообщений, при хэшировании которых получаются одинаковые значения хэша.
Функция должна быть устойчива к «атаке дня рождения» (birthday attack) (эта атака описана в разделе "Атаки на односторонние хэширующие функции").

В Таблице 6-2 и следующих разделах вкратце описаны некоторые из доступных алгоритмов хэширования, используемые в криптографии в настоящее время.

Таблица 6-2. Различные алгоритмы хэширования


MD2 – это односторонняя функция хэширования, разработанная Роном Ривестом, она создает 128-битное значение дайджеста сообщения. Она не обязательно слабее всех остальных алгоритмов семейства MD, но она очень медленная.


MD4 – это односторонняя функция хэширования, разработанная Роном Ривестом. Она также создает 128-битные значения дайджеста сообщения. Она используется для высокоскоростных вычислений в программных реализациях и оптимизирована для микропроцессоров.


MD5 также создана Роном Ривестом и является новой версией MD4. Она также создает 128-битные хэши, но ее алгоритм более сложен и более устойчив к взлому.

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


Когда американскому правительству потребовался более безопасный алгоритм хэширования Агентством Национальной Безопасности был разработан алгоритм SHA для использования в стандарте DSS (Data Signature Standard). SHA предназначен для формирования цифровых подписей.

SHA создает 160-битное значение хэша (или дайджеста сообщения). Затем это значение хэша передается в асимметричный алгоритм, который рассчитывает значение подписи для сообщения.

SHA похож на MD4. Он использует некоторые дополнительные математические функции и создает 160-битные значения хэша (а не 128-битные). Он более устойчив к брутфорс-атакам, включая атаку «дня рождения».

SHA был усовершенствован и переименован в SHA-1. Недавно были разработаны и выпущены новые версии этого алгоритма (вместе называемые семейством алгоритмоы SHA-2): SHA-256, SHA-384 и SHA-512.


HAVAL – это односторонняя хэширующая функция, создающая хэши, длиной от 128 до 256 бит. HAVAL является модификацией MD5. Она обрабатывает сообщение, разбивая его на блоки по 1024 бита (вдвое больше длины блоков в MD5).


Росс Андерсон и Эли Бихэм разработали в 1995 году алгоритм хэширования, названный Tiger. Он был разработан для выполнения функций хэширования в 64-битных системах, скорость его работы превышает скорость MD5 и SHA-1. Он создает хэш-значения длиной 192 бита. Большинство алгоритмов хэширования (например, MD5, RIPEMD, SHA0, SHA1) построены на основе архитектуры MD4. Tiger основан на другой архитектуре, чтобы он не был уязвим для тех же видов атак, которые успешно применялись против других алгоритмов хэширования. Чтобы лучше понять, как проводились атаки в процессе тестирования алгоритма Tiger, ознакомьтесь с этим документом http://th.informatik.uni-mannheim.de/people/lucks/papers/Tiger_FSE_v10.pdf.

ПРИМЕЧАНИЕ. В рамках европейского проекта, названного RIPE (RACE Integrity Primitives Evaluation), был разработал алгоритм хэширования на замену MD4. Этот алгоритм был назван RIPEMD. Он очень похож на MD4, но он не привлек такого же внимания.

Ссылки по теме:


Хороший алгоритм хэширования не должен создавать одинаковое значение хэша для двух различных сообщений. Одинаковое значение хэша для двух (или более) различных сообщений называется коллизией (collision). Атакующий может попытаться создать коллизию специально, что называется атакой «дня рождения» (birthday attack). Эта атака основана на математическом парадоксе «день рождения», существующем в обычной статистике. Например, сколько людей нужно собрать в одной комнате, чтобы среди них нашелся человек, родившийся в тот же день, что и вы? Ответ: 253. Сколько людей нужно собрать в одной комнате, чтобы среди них нашлись два или более человека, родившийся в один день? Ответ: 23.

Обратите внимание, сколько нужно людей, чтобы у одного из них день рождения совпал с вашим. А теперь посмотрите, сколько людей нужно для того, чтобы день рождения совпал у кого-то среди них. Вероятность найти двух людей, родившихся в один день, выше, чем вероятность найти человека, родившегося в тот же день, что и вы. Другими словами, проще найти два совпадающих значения в море значений, чем найти в нем значение, равное определенному значению.

Но зачем это нам? Парадокс «день рождения» может применяться в криптографии. Для любой случайной группы из 23 человек высока вероятность (не менее 50%), что в ней найдутся два человека с одинаковым днем рождения. Переводя это в криптографию, можно сказать, что если алгоритм хэширования создает 60-битные значения хэшей, существует высокая вероятность коллизии при сравнении хэшей всего 2^30 сообщений.

Основная задача атакующего – попытаться с помощью брутфорс-атаки найти сообщения, значения хэшей которых совпадают со значением хэша определенного сообщения. Если это ему удается, это аналогично нахождению человека с таким же днем рождения. Если он находит два сообщения с одним и тем же значением хэша, это аналогично нахождению двух людей с одинаковым днем рождения.

Если длина результирующего значения на выходе из алгоритма хэширования является n, то чтобы с помощью брутфорс-атаки найти сообщение с определенным значением хэша, потребуется рассчитать хэши для 2^n случайных сообщений. А чтобы просто найти два сообщения с одинаковым значением хэша, потребуется рассчитать хэши для 2^n/2 случайных сообщений.

Как может произойти атака дня рождения в криптографии?

Предположим, что Сью и Джо собираются пожениться, но перед этим они заключают брачный контракт, в котором указано, что в случае развода Сью получит свою первоначальную собственность, а Джо – свою. Чтобы гарантировать, что контракт не изменен, используется функция хэширования и создается дайджест сообщения.

Через месяц после свадьбы Сью делает копию значения дайджеста сообщения и пишет новый брачный контракт, в котором указывает, что в случае развода она получает не только свою собственность, но и собственность Джо. Сью создает хэш нового контракта и сравнивает его с хэшем первоначального варианта. Они не совпадают. Тогда Сью немного изменяет новый контракт, рассчитывает новое значение хэша и снова сравнивает его с первоначальным. Она продолжает вносить незначительные (почти незаметные) изменения в новый контракт, пока не находит коллизию, в результате которой выполнение той же функции хэширования над ее новым вариантом контракта дает такое же значение дайджеста сообщения, что и первоначальный контракт. Затем Сью заменяет первоначальный контракт на новый и по-быстрому разводится с Джо. Забирая собственность Джо, она показывает ему новый контракт, и доказывает его неизменность, сравнивая значения хэша.

Алгоритм хэширования обычно создает значения хэша достаточно большого размера (значение n), затрудняя нахождение коллизий, но они остаются реальными. Например, алгоритм, создающий 160-битные хэши (например, SHA-1), требует перебрать порядка 2^80 вариантов сообщения для нахождения коллизии. Таким образом, существует менее одного шанса на 2^80, что кому-то удастся выполнить успешную атаку «дня рождения».

Парадокс «день рождения» показывает важность использования длинных значений хэша. Чем более длинный результат выдает алгоритм хэширования, тем меньше он уязвим к брутфорс-атаке, такой как атака «дня рождения». Именно по этой причине новая версия SHA выдает такие длинные значения дайджеста сообщения.

Ссылки по теме:


Цифровая подпись – это значение хэша, зашифрованное на закрытом ключе отправителя. Процесс подписи значения хэша сообщения закрытым ключом показан на Рисунке 6-22.

Рисунок 6-22. Создание цифровой подписи сообщения

Вспомним наш пример из раздела «Односторонние хэши». Если Кевину нужно гарантировать отсутствие изменений в сообщении, которое он отправляет Марии, и обеспечить, чтобы она была уверена в том, что сообщение исходит именно от Кевина, он может подписать сообщение с помощью цифровой подписи. Для этого сообщение сначала обрабатывается с помощью односторонней функции хэширования, а затем Кевин зашифровывает полученное значение хэша на своем закрытом ключе.

Мария, получив сообщение, выполнит функцию хэширования над сообщением и получит свое собственное значение хэша. Затем она расшифрует полученное в сообщении значение хэша (цифровую подпись) на открытом ключе Кевина. Теперь она может сравнить два значения, и если они совпадут, она будет уверена, что сообщение не было изменено в процессе передачи. Она также будет уверена, что сообщение исходит именно от Кевина, поскольку значение хэша было зашифровано на его закрытом ключе.

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

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

Важно понимать, что не все алгоритмы реализуют одновременно все сервисы безопасности. Большинство алгоритмов используются в комбинации с другими, для обеспечения необходимого набора сервисов безопасности. В Таблице 6-3 показаны сервисы, обеспечиваемые различными алгоритмами.

Таблица 6-3. Функциональность различных алгоритмов



Поскольку применение цифровой подписи является крайне важным компонентом при определении того, кто отправил сообщение, правительство США решило издать стандарт, относящийся к функциональности и приемлемому использованию цифровой подписи. В 1991 году NIST предложил федеральный стандарт, названный Стандартом цифровой подписи (DSS – Digital Signature Standard). Он был разработан для федеральных управлений и агентств, но большинство производителей также воспользовались этим стандартом при разработке своей продукции. Федеральное правительство требует, чтобы его департаменты использовали DSA, RSA или ECDSA (Elliptic Curve Digital SignatureAlgorithm). Реализовано это следующим образом: SHA создает дайджесты сообщений длиной 160 бит, которые затем передаются в один из трех вышеуказанных алгоритмов для формирования цифровой подписи. При этом SHA используется для обеспечения целостности сообщений. Это пример совместного использования двух различных алгоритмов для получения нужного сочетания сервисов безопасности.

RSA и DSA являются хорошо известными и наиболее широко используемыми алгоритмами цифровой подписи. DSA был разработан Агентством национальной безопасности США. В отличие от RSA, DSA может применяться только для формирования цифровой подписи, кроме того, DSA медленнее RSA при проверке подписи. А RSA может применяться не только для цифровой подписи, но и для шифрования и безопасного распространения симметричных ключей.


1 комментарий:

eagle комментирует...

- Johannes Ullrich. "Hashing Passwords": http://isc.sans.org/diary.html?storyid=11110