При исследовании схемы идентификации и аутентификации с помощью процедуры рукопожатия будем использовать следующие алгоритмы:
· для шифрования и дешифрования случайного значения S — алгоритм симметричного шифрования DES;
· для получения хэш значения от S — алгоритм вычисления дайджеста (профиля) сообщения MD5.
Рассмотрим криптографические блоки, реализующие функции получения дайджеста. Построение классов, реализующих хэш-функции, базируется на наборе стандартных функций определенных в классе BaseHash.
Класс BaseHash предоставляет пользователю следующие функции:
· void reset() — выполняет сброс внутренних данных для последующего получения хэш-значений;
· boolean compare(byte dig1[],byte dig2[]) — выполняет сравнение двух хэш-значений и возвращает истинное значение, если значения равны, иначе — ложное значение.
В данном классе также определены абстрактные функции, которые реализуются в классах-потомках.
Алгоритм хэширования MD5 реализован в виде класса MD5.
Основные функции класса MD5:
|
|
· MD5() — конструктор;
· void update(byte[] b, int offset, int len) — выполняет установку исходных данных для получения хэш-значения, offset — смещение в буфере данных b, len — длина данных;
· byte[] digest() — возвращает дайджест данных, установленных с помощью функции update, данные возвращаются в виде 16-байтового массива;
· byte[] convertBytes(byte d[]) — преобразует данные из 16-байтового массива в бинарный массив из 128 байт, где каждый байт определяет значение одного бита.
Для удобства получения хэш-значений разработаны статические методы:
· byte[] digest(String s) — возвращает дайджест строки s в виде бинарного массива из 128 байт;
· byte[] digest(byte b[]) — возвращает дайджест бинарных данных b в виде бинарного массива из 128 байт.
Пример получения дайджеста сообщения:
byte data[]= Binary.setFromHex("BBBB CCCC 4444 6666")
byte digest[]=MD5.digest(data);
Рассмотрим задачу идентификации и аутентификации субъекта B при обращении к ресурсу А.
Статическая модель представлена на рисунке 6.2.1.
Рисунок 6.2.1 — Статическая модель схемы для изучения схемы идентификации и аутентификации
Процессы, представляющие собой субъекты и ресурсы, выполняют взаимодействие по каналам передачи данных:
· канал передачи идентификатора от процесса А процессу В;
· канал передачи криптограммы случайной последовательности S от процесса А процессу В;
· канал передачи криптограммы дайджеста последовательности S от процесса В процессу А, полученной путем применения шифрования к значению односторонней функции от S.
Диаграмма взаимодействия процессов представлена на рисунке 6.2.2.
Рисунок 6.2.2 — Диаграмма взаимодействия процессов для изучения схемы идентификации и аутентификации
|
|
В области данных процесса А определим следующие переменные:
int id=1;
byte key[]=Binary.setFromHex("BBBB CCCC 4444 6666");
byte s[];
где s — переменная для хранения случайной последовательности S;
key — ключ процесса А;
id —идентификатор процесса А.
В области данных процесса В определены переменные:
BinaryVector ids=new BinaryVector();
byte key[];
byte s[];
где ids — список ключей для идентификаторов;
key — переменная для хранения ключа, соответствующего идентификатору процесса А;
s — переменная для хранения случайной последовательности.
Для управления процессами передачи сообщений у процесса А определены методы:
· sendId — выполняет отправку идентификатора процесса А;
· sendES — выполняет генерацию последовательности S, шифрование и отправку криптограммы процессу В.
У процесса В определен метод sendAS, выполняющий формирование дайджеста последовательности S, шифрование и отправку результата процессу А.
Определения методов процесса А приведено в таблице 6.2.1.
Таблица 6.2.1 — Методы процесса А
Метод | Определение метода |
sendId | send("id_out",new Integer(id)); |
sendES | s=Binary.random(64); byte es[]=DES.encode(key,s); send("es_out",es); |
onRecieve | if (hasMoreData("as_in")) { byte ds[]=MD5.digest(s); byte as_r[]=(byte[])recv("as_in"); DES des = new DES(); des.setKey(key); byte ds_r[] = des.decodeData(as_r,BlockCipher.MODE_ECB); if (BaseHash.compare(ds,ds_r)) logMessage("B подлинный"); else logMessage("B ложный"); } |
Определения методов процесса В представлены в таблице 6.2.2.
Таблица 6.2.2 — Методы процесса В
Метод | Определение метода |
onCreate | ids.put(Binary.setFromHex("AAAA 1111 2222 3333"),0); ids.put(Binary.setFromHex("BBBB CCCC 4444 6666"),1); |
onRecieve | if (hasMoreData("id_in")) { int id=((Integer)recv("id_in")).intValue(); key=ids.get(id); } else if (hasMoreData("es_in")) { byte es[]=(byte[])recv("es_in"); s=DES.decode(key,es); } |
SendAS | byte ds[]=MD5.digest(s); DES des = new DES(); des.setKey(key); byte as[] = des.encodeData(ds,BlockCipher.MODE_ECB); send("as_out",as); |
Для моделирования описанного протокола требуется выполнить действия:
а) запустить сервер моделирования;
б) запустить клиент моделирования для процесса А;
в) запустить клиент моделирования для процесса В;
г) запустить метод процесса А sendId;
д) запустить метод процесса А sendES;
е) запустить метод процесса В sendAS.
В результате будет получено сообщение о проверке подлинности процесса В. Для проверки подлинности процесса А требуется дополнить модель аналогичной схемой.
Выполнение работы
1. Определить модель схемы идентификации и аутентификации, указанную в разделе 6.2.
2. Выполнить моделирование схемы идентификации и аутентификации. Зафиксировать результат аутентификации и промежуточные данные.
3. Изменить идентификатор процесса А на 0 в области данные процесса А. Провести повторное моделирование и зафиксировать результат и промежуточные данные.
4. Расширить модель аутентификацией процесса А и зафиксировать результат.
Содержание отчета
Отчет выполняется один на бригаду и должен включать:
1. Наименование и цель работы.
2. Краткие теоретические сведения.
3. Статическую модель согласно варианта.
4. Окна редактирования ресурсов, субъектов, угроз, уязвимостей, средств защиты.
5. Анализ защищенности
6. Выводы.