Криптография во FreeBSD и не только. Часть 1


Dru Lavigne
перевод Станислава Лапшанского
Впервые опубликован: http://www.computerra.ru.


В этой и нескольких последующих статьях я расскажу о шифровании данных, передаваемых по компьютерным сетям. Если вы помните цикл статей, посвященных обсуждению IP-пакетов (см. http://www.onlamp.com/pub/a/bsd/2001/03/21/FreeBSD_Basics.html), то вы уже знаете, что подавляющее большинство данных передается по сетям в открытом виде, легко перехватываемом злоумышленником при помощи снифферов. Такая ситуация может быть неприемлема в случае передачи пользовательских имен, паролей и некоторой другой важной информации. К счастью, существуют так называемые криптосистемы (криптографические системы), предназначенные для защиты передаваемых в сети данных от посторонних глаз.

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

Итак, что же такое криптосистемы и почему вам надо их использовать? Криптосистема - это набор программ, которые, используя совокупность алгоритмов, предоставляют пользователю три вещи: приватность, целостность и аутентичность. Каждая из них важна сама по себе, поэтому давайте разберемся с ними по очереди.
Приватность

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

Может случиться, что кто-то расшифрует данные при помощи взлома (подбора) ключа. Под стойкостью шифровального алгоритма понимается сложность взлома его ключа. Обычно сложность взлома пропорциональна длине ключа. Длина ключей измеряется в битах. Например, что бы взломать ключ 56-битного алгоритма, обычно требуется гораздо меньше времени, чем что бы взломать ключ 256-битного.

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

Существует ряд других соображений, которые следует учитывать при выборе алгоритма шифрования. Некоторые алгоритмы запатентованы и их применение требует лицензирования. Применение некоторых алгоритмов разрешено лишь в некоторых областях деятельности. Некоторые алгоритмы слишком легко взламываются или компрометируются. Скорость работы различных алгоритмов часто сильно отличается вне зависимости от размера ключа. Например DES и 3DES считаются медленными, а Blowfish - очень быстрым несмотря на большую длину ключа.

Существуют законодательные ограничения на использование тех или иных алгоритмов, которые существенно отличаются от страны к стране. (Стоит отметить, что на территории Российской Федерации официально позволено применение лишь криптографических средств сертифицированных ФАПСИ. Объясняется это заботой о безопасности граждан, поскольку всегда существует вероятность существования в алгоритмах так называемых "закладок", при помощи которых их создатели легко могут расшифровать шифротекст без обладания секретным ключом. Насколько свободны от "закладок" алгоритмы, предлагаемые российскими спецслужбами, можно только догадываться, опираясь на многочисленные свидетельства чистоты их рук - прим. переводчика.)

Некоторые страны ввели экспортные ограничения. Это значит, что внутри страны разрешается применять сильную криптографию с большой длиной ключа, но как только получателем информации становится лицо, находящееся за пределами страны, законопослушный отправитель должен использовать менее сильные алгоритмы с меньшей длиной ключа. Соединенные Штаты Америки ограничивают вывоз криптографических алгоритмов с длиной ключа более 40 бит (сейчас это ограничение несколько смягчено - прим. переводчика), вот почему некоторые алгоритмы поддерживают лишь скромные ключи размером 40 бит. (Разумеется у свободолюбивого интернет- и корыстолюбивого бизнес-сообщества имеется, мягко говоря, другой взгляд на данную проблему. Поэтому ситуация с течением времени кажется, меняется в пользу разрешения применения сильной криптографии. Обсуждению вопросов применения сильной криптографии посвящен не один номер бумажной Компьютеры. - прим. переводчика.)

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

В этой таблице сравнивается несколько алгоритмов, о которых вы могли слышать. Алгоритм Размер ключа Запатентован Комментарий
DES 56 медленный, легко вскрывается
3DES 168 медленный
Blowfish 32 - 448 нет чрезвычайно быстрый
IDEA 128 да
CAST 40 - 128 да
Arcfour 40, 128
AES (Rijndael) 128, 192, 256 нет быстрый
Twofish 128, 256 нет быстрый

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

Если криптосистема использует туннельный режим, то шифруется весь пакет - и заголовок и данные. Поскольку необходимость маршрутизации пакета сохраняется, создается еще один пакет третьего уровня, в который вкладывается зашифрованный пакет. Этот процесс называется инкапсуляцией. С его помощью можно установить совершенно другой адрес получателя, чем тот, который находится в первоначальном пакете. Зачем такое может понадобиться, мы обсудим позже, когда будем разговаривать о конфигурировании FreeBSD для использования IPSec.
Целостность

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

Подобно алгоритмам шифрования, алгоритмы подсчета контрольных сумм отличаются по своей эффективности. Для более длинных контрольных сумм сложнее подобрать последовательность данных, при которой сумма оставалась бы неизменной. Некоторые алгоритмы подвержены известным уязвимостям. Вот таблица, в которой собраны сведения по распространенным алгоритмам генерации контрольных сумм: Алгоритм генерации
контрольной суммы Длина Известные
уязвимости
MD4 128 есть
MD5 128 теоретически есть
SHA 160 теоретически есть
SHA-1 160 пока нет


Подобный порядок упоминания алгоритмов в таблице не случаен. Применительно к криптографическим контрольным суммам, алгоритм MD4 дает наименьшую надежность, а SHA-1 - наибольшую. Всегда выбирайте наиболее надежную хеш-функцию, доступную в вашей системе.

Следует упомянуть еще об одном вещи, имеющей отношение к криптографическим хеш-функциям, это так называемый HMAC (Hash-based Message Authentication Code - хешевый код идентифицирования сообщений), при использовании HMAC для генерации контрольной суммы используется шифровальный ключ. Это полезно, поскольку невозможно сгенерировать контрольную сумму без доступа к ключу. Если при генерации контрольной суммы используется HMAC, то об этом сообщается добавлением аббревиатуры "HMAC" перед названием алгоритма хеш-функции. Например, HMAC-MD4 дает большую безопасность, чем MD4, а HMAC-SHA - большую, чем просто SHA. Если опять отсортировать алгоритмы в порядке повышения их надежности, то получится следующий список:
MD4
MD5
SHA
SHA-1
HMAC-MD4
HMAC-MD5
HMAC-SHA
HMAC-SHA-1
Аутентичность

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

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

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

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

Наиболее распространенным алгоритмом генерации ключа является алгоритм RSA. Довольно часто можно увидеть слово RSA рядом с фразами "digital certificates" (цифровые сертификаты) или "certificate authorities" (Встречается два перевода этого термина - "сертификат подлинности" и "сертификационные органы". Второй перевод правильный - прим. переводчика), так же используется аббревиатура "CA". Цифровой сертификат - это подписанный файл, содержащий в себе открытый ключ и некоторую другую информацию о его владельце, а так же дату истечения "срока годности" сертификата. Состав информации, содержащейся в сертификате, описан в стандарте X.509 или PKCS #9. Вы можете почитать эти стандарты, обратившись по адресу http://ftp.isi.edu/in-notes/rfc2985.txt или http://www.rsasecurity.com/rsalabs/pkcs, соответственно.

Цифровые сертификаты обычно хранятся на так называемом "Certificate Authority" сервере (сервере сертификатов). Таким образом от вас не требуется обмениваться публичными ключами вручную. Ваша криптосистема в случае необходимости сама запрашивает у CA-сервера открытый ключ получателя. Такая схема позволяет строить масштабируемую систему аутентификации. Сервер сертификатов может хранить сертификаты многих пользователей, которые могут быть как людьми, так и компьютерами.

Для генерации цифровых сертификатов можно использовать алгоритм DSA. Однако этот алгоритм запатентован и, кроме того, работает несколько медленнее, чем RSA. Про разницу между RSA и DSA можно прочитать на страничке "часто задаваемых вопросов об отличиях между DSA и RSA" (см. http://www.rsasecurity.com/rsalabs/faq/3-4-1.html). (Вообще страничка "RSA Laboratories' FAQ" может стать неплохим источником сведений в случае, если вы решили углубить свои знания в области криптографии.)

Есть еще один вопрос, который нам следует обсудить в связи с цифровыми сертификатами и CA. Цифровой сертификат имеет "срок годности" и не может быть удален с CA-сервера до указанной даты. Что произойдет, если секретный ключ будет скомпрометирован до истечения срока годности сертификата? Разумеется, вам захочется сгенерировать новый сертификат, в котором будет содержаться другая пара ключей. Однако вы не можете удалить скомпрометированный сертификат по истечения его срока годности. Для того, чтобы быть уверенным, что сертификат не будет использован по неосторожности при проверке подлинности получателя, вы можете поместить его в CRL или Certificate Revocation List (список отозванных сертификатов). При каждом запросе сертификата производится проверка списка отозванных сертификатов для удостоверения, что сертификат все еще действителен.

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

Важно осознать, что алгоритм Диффи-Хеллмана не используется для генерации собственно сессионного ключа, а вот информация, получаемая с его помощью, как раз используется в процессе генерации. Все это основывается на весьма сложных математических выкладках, не рекомендуемых для чтения слабонервным (на самом деле, если не вдаваться в подробности и не обременять себя доказательствами из теории поля, все довольно просто - прим. переводчика). Лучшее объяснение человеческим языком с картинками, которое мне удалось найти, это статья Кейта Палмгрена "Диффи-Хеллмановский обмен ключами - нематематическое объяснение" (см. http://networking.earthweb.com/netsecur/article/0,,12340_624441,00.html).

Необходимо хранить ключевую информацию настолько защищенной, насколько это возможно, так что чем больше бит в ключе, тем лучше. Возможные размеры ключа в Диффи-Хеллмановском алгоритме делятся на группы. В таблице сведены возможные значения Диффи-Хеллмановских групп: Наименование Размер
1 768
2 1024
5 1536

При конфигурировании криптосистемы используйте максимально поддерживаемый ею размер группы.

PFS или Perfect Forward Secrecy часто упоминается в связи с алгоритмом Диффи-Хеллмана. PFS предназначена для обеспечения гарантии того, что новая ключевая информация не будет никак связана со старой. Это означает, что если кто-нибудь узнает старый сессионный ключ, он не сможет воспользоваться им для генерации нового секретного ключа. PFS полезная вещь и, если используемая вами криптосистема поддерживает эту функцию, ее следует включить.
Резюме

Давайте быстренько подведем итог, как криптосистемы защищают данные передаваемые по сети.
В начале, используя открытый ключ получателя, вы убеждаетесь, что данные придут в нужные руки. Открытые ключи генерируются алгоритмом RSA и обычно содержатся в сертификатах на сертификационных серверах.
После проверки подлинности получателя, при помощи алгоритма Диффи-Хеллмана генерируется информация, используемая для создания сессионного ключа.
Как только создана ключевая информация, создается сессионный ключ, уникальный для каждой сессии. Этот ключ применяется для шифрования/дешифрования данных как отправителем, так и получателем. Именно поэтому важно часто его менять.
Перед шифрованием данных подсчитывается их криптографическая контрольная сумма. После расшифровки контрольная сумма пересчитывается для того, чтобы убедиться в том, что сообщение не было искажено при передаче.

http://www.onlamp.com/pub/a/bsd/2002/10/31/FreeBSD_Basics.html.

Обновлено: 12.03.2015