Q: Получается, что открытый ключ никак не защищен? Как проверяющий подпись
может быть уверен, что имеющийся у него для проверки открытый ключ
действительно принадлежит автору сообщения?
A: Для этого используются не просто открытые ключи, а их сертификаты,
формируемые Центром Сертификации Ключей (Центром Распределения Ключей,
Certificate Authority). В качестве центра сертификации выбирается организация,
которой доверяют все участники обмена и которой они лично предъявляют свои
открытые ключи. Центр формирует из собранных ключей сертификаты путем
подписания их своей электронной подписью. После этого каждый участник получает
сертификат (собственный открытый ключ, подписанный центром) и открытый ключ
центра. Теперь при установлении связи корреспонденты обмениваются не просто
открытыми ключами, а сертификатами, что дает возможность однозначно
идентифицировать второго участника обмена путем проведения процедуры проверки
электронной подписи центра под его сертификатом.
Существуют рекомендации X.509, в которых описано, что должен в себя включать
сертификат.
Содержание сертификата по рекомендации X.509:
- номер сертификата;
- имя владельца сертификата;
- имя Центра сертификации, выдавшего сертификат;
- идентификатор алгоритма подписи, используемого для подтверждения
подлинности сертификата;
- открытый ключ (собственно, то, ради чего весь этот цирк :) );
- срок действия сертификата;
- подпись всей этой информации на секретном ключе Центра сертификации.
VI. Криптографические протоколы.
DH
Diffie-Hellman. Протокол передачи секретных ключей с использованием
алгоритмов на открытом ключе. Для шифрования данных не используется.
Если обозначить секретный ключ абонента как X, открытый ключ как Y и
установить соответствие между ними как Y=A^X (A в степени X, где A
является константой), то приближенно получение общего секретного
ключа можно записать так.
Каждый участник вычисляет K на основе своего секретного ключа и открытого
ключа другого абонента:
K=Y2^X1=(A^X2)^X1= A^X2X1
K=Y1^X2=(A^X1)^X2= A^X1X2
Как видим, вычисленное на обоих концах канала связи значение K одинаково, при
этом по каналу передавались только значения Y1 и Y2, на основании которых
потенциальный злоумышленник, прослушивавший канал, не сможет вычислить X1 и
X2, равно как и общий секрет K.
KEA
Key Exchange Algorithm. Вариации на тему Diffie-Hellman.
Q: Что такое Perfect Forward Secrecy?
A1. Если мне не изменяет мой склероз, Perfect Forward Secrecy -- это
свойство протокола, заключающееся в том, что захват противником
_криптографических_ параметров не приводит к нарушению
конфиденциальности данных, передаваемых _после_ события захвата.
Пример.
Рассмотрим протокол, в котором передача очередного сообщения
осуществляется следующим образом.
1. Обе стороны генерируют пару секретный ключ - открытый
ключ, и каждая сторона передает другой по доверенному, но
_неконфиденциальному_ каналу, свой открытый ключ.
2. Передающая сторона генерирует свой секретный сеансовый ключ.
3. По протоколу открытого распределения ключей Диффи-Хеллмана
сеансовый ключ передается стороне-получателю.
4. Отправитель шифрует сообщение на сеансовом ключе, отправляет
получателю, а тот расшифровывает его.
5. Каждая из сторон уничтожает все ключи, а именно сеансовый ключ
и свой секретный.
Передача одного сообщения должна являться одной транзакцией.
В этом протоколе ни до, ни после передачи сообщения стороны
не владеют секретной информацией, которая может привести
к раскрытию сообщения или ключей.
A2. Согласно IPSEC, Perfect Forward Secrecy -- это следующее свойство
протокола: компрометация ключа приводит к раскрытию только тех
данных, которые были зашифрованы на этом ключе.
VII. Криптоанализ.
Q: Какие есть методы криптоанализа, атаки на шифры?
A: Распространена следующая классификация: FIXME!
* ciphertext only attack (атака с известным шифртекстом).
* known plaintext attack (атака с известным открытым текстом)
* chosen plaintext attack (атака с выбором открытого текста)
* adaptive chosen plaintext attack (адаптивная атака с выбором открытого текста)
* chosen ciphertext attack (атака с выбором шифртекста)
* adaptive chosen ciphertext attack (адаптивная атака с выбором шифртекста)
* chosen text attack (атака с выбором текста)
* chosen key attack (атака с выбором ключа)
* physical attack - атака, при которой используются физические методы перехвата;
например, так секретный ключ из смарт-карт вынимали - измеряя ток потребления
при шифровании или облучая их гамма-излучением для того, чтобы сбросить ключ
в ноль;
* social engineering attack - позвонить по телефону и грозным голосом приказать
немедленно принести дискетку с ключом по такому-то адресу; :)
* man-in-the-middle attack (атака "человек посередине") - злоумышленник
"разрывает" канал связи и взаимодействует с каждым из участников обмена от
имени другого. Применяется, в частности, против алгоритма распределения ключей
Диффи-Хэллмана. Легко нейтрализуется использованием вместо открытых ключей их
сертификатов.
Рассмотрим подробнее:
Допустим есть два законных абонента A и B, при этом у противника есть два
варианта атаки:
- противник С выдает себя за абонета А и от его имени говорит с B;
- противник C вклинивается между A и B и в протоколе с А выдает себя
за В, а в протоколе с В выдет себя за А, то есть пропускает разговор
через себя и тем самым подслушивает его. Также может навязывать ложную
информацию.
Решение этой проблемы - центр доверия, куда помещаются открытые ключи абонентов
сети. Центру доверия все верят. Предполагается, что Центр доверия не подвержен
атакам.
В частности для рассылки открытых ключей предложена система сертификатов.
Рекомендация X.509 ITU-T описывает эти структуры и предложения по их
использованию.
Q: Hасколько стойким является шифрование ZIP-архива с паролем?
A: Как доказал Paul Kocher, его стойкость оценивается в 2^38
операций. Подробнее см. статью "A Known Plaintext Attack on
the PKZIP Stream Cipher" (Eli Biham, Paul C. Kocher).
Q: А как дешифровать пароли в UNIX, WINDOWS, NetWare? Насколько хорошо они
защищены?
A: В этих системах они защищены по-разному.
Если рассматривать проблему укрупненно, то можно выделить два основных
подхода к хранению паролей, и, соответственно, к используемой схеме
аутентификации.
Первый подход заключается в защищенном хранении паролей на сервере.
При этом, в случае хищения базы с паролями, злоумышленник не сможет
воспользоваться этими данными непосредственно, ему понадобится
произвести некоторое количество преобразований (подчас весьма
сложных), так как пароли преобразованы односторонней функцией, и
узнать их можно только "прогоняя" различные варианты паролей через эту
функцию и сравнивая результат; в данной ситуации, это - единственный
способ дешифрования. Очевидно, что при таком подходе пользователь
должен предъявлять серверу пароль в открытом виде, чтобы последний,
произведя над ним соответствующее преобразование, сравнил полученный
результат с записью в базе паролей. Ну, а коль скоро пароль
предъявляется в открытом виде, возможен его перехват при передаче по
каналам связи. Конечно, если использовать даже самую сложную функцию
вида:
y=f(x) (1)
где x - пароль, а y - значение односторонней функции (как правило, в
качестве односторонней используется хэш-функция, которая должна
обладать, как минимум, следующими характеристиками: ее значение имеет
фиксированный размер независимо от размера параметра, а подбор
параметра под заданное значение является сложной задачей), то
одинаковым паролям будут соответствовать одинаковые значения функции.
Злоумышленнику в этом случае достаточно будет один раз обработать
большой словарь и в дальнейшем просто определять пароль по значению
функции. Чтобы устранить эти недостатки в процесс вычисления вводят
дополнительный элемент - salt, который для каждой генерации пароля
выбирается случайным образом, после чего формула (1) приобретает вид:
y=f(salt,x) (2)
а в базе паролей на сервере хранится пара чисел (salt,y). Такой подход
к защите паролей применяется в большинстве UNIX-систем. В качестве
преобразования (2) используется алгоритм шифрования DES (x выступает в
роли ключа шифрования), либо алгоритм хэширования MD5.
Другой подход направлен на невозможность перехвата пароля при его
передаче. В этом случае пользователь доказывает серверу, что ему
известен правильный пароль, не путем предъявления его в открытом виде,
а путем вычисления над предложенным сервером числом некоей функции,
зависящей также и от пароля. В простейшем случае это может быть
шифрование предложенного сервером числа, используя в качестве ключа
пароль. Естественно, что для проверки значения функции, присланного
пользователем, серверу необходимо повторить данное преобразование, а
для этого, в свою очередь, он должен обладать паролем в открытом виде.
Схема похожа на предыдущую, изменяется только место вычисления
односторонней функции, а роль salt играет высылаемое сервером число.
Очевидно, что при этом способе осуществления аутентификации,
необходимо принять меры по недопущению несанкционированного доступа к
базе паролей на сервере. Такой подход применяется в семействе ОС
Novell NetWare, а также Windows NT.
Про атаки типа brute-force лучше прочитать отдельно для каждой системы.
Для unix-подобных систем (и не только) см. программу John-The-Ripper.
(primary site http://www.false.com/security/john/)
Для windows (pwl) - PWLCrack
(primary site http://www.geocities.com/SiliconValley/Hills/7827)
Для NetWare 3.x - http://cybervlad.port5.com/nwpass/index.html (или более
полную версию - netware.pdf, там же).
Q: Какова минимально безопасная длина ключа?
A: Ответ на этот вопрос сложно зафиксировать, т.к. очень быстро меняется
производительность техники. Развитие методов криптоанализа тоже не стоит на