4. Для любого данного значения хеш-кода h вычислительно невозможно найти M такое, что Н (M) = h.
5. Для любого данного х вычислительно невозможно найти y
x, что H(y) = H(x).6. Вычислительно невозможно найти произвольную пару (х, y) такую, что H(y) = H (x).
Термин вычислительно невозможно означает здесь, что в настоящее время решение этой задачи либо требует слишком большого интервала времени (например, более сотни лет), либо использования слишком больших вычислительных ресурсов, чтобы решение задачи имело смысл.
Первые три свойства требуют, чтобы хеш-функция создавала хеш-код для любого сообщения. Четвертое свойство определяет требование односторонности хеш-функции: легко создать хеш-код по данному сообщению, но невозможно восстановить сообщение по данному хеш-коду.
Схемы аутентификации.
Поскольку при передаче данных по сети никто не застрахован от возможности чтения данных на промежуточных узлах, то передача пароля по сети в открытом виде является опасным. Поэтому для надежной аутентификации и сохранения пароля от взлома используются разные схемы сетевой аутентификации. Здесь мы рассмотрим следующие три схемы:
Схема аутентификации на основе слова-вызова и хеш-свертки.
В этой схеме пользователь зарегистрировавшись на сервере, получает секретный ключ P, который сохраняется также на сервере. При выходе на связь пользователь посылает сначала свой идентификатор. Получив индентификатор, сервер проверяет наличии такого пользователя по своей базе данных и затем возвращает пользователю случайное большое число N (обычно длины 16 байт), называемое словом–вызовом. Пользователь, получив это число, формирует пару <N, P, ТS>, где P обозначает пароль пользователя, ТS – текущий момент времени (Time Stamp), подвергает ее хеш-преобразованию и отправляет полученное значение h=h(<N,P>) серверу. Сервер, получив свертку h, извлекает из базы данных пароль пользователя, выполняет то же преобразование h(<N,P) и сравнивает два полученных значения h. Если они совпали, то процедура аутентификация считается успешной.
Схема аутентификации на основе электронно-цифровой подписи (ЭЦП).
В этой схеме пользователь зарегистрировавшись на сервере, получает пару открытый/секретный ключ P. Открытый ключ сохраняется также на сервере. При выходе на связь пользователь формирует набор < Id, M, Тs>, где Id обозначает идентификатор пользователя, M – сообщение пользователя, Тs – метка времени (Time Stamp), подвергает его хеш-преобразованию h=h(< Id, M, Тs>) и шифрует закрытым ключом EncKз(h). Полученный код называется электронно-цифровой подписью и служит для подтверждения неизменности сообщения и проверки авторства послания. Электронно-цифровая подпись EncKo(h(< Id, M, Тs>)) прикладывается с исходному сообщению < Id, M, Тs> и отправляется на сервер.
Сервер, получив пакет, расшифровывает ЭЦП, извлекая свертку h(< Id, M, Тs>), параллельно вычисляет такую же свертку h= h(< Id, M, Тs>), используя те же исходные данные и хеш функцию, и сравнивает два полученных значения h. Если они совпали, то процедура аутентификация считается успешной. Временная метка Ts выполняет роль сеансового ключа для предотвращения атак воспроизведения.
Использование хеш-функции в этом методе не является обязательным и служит лишь для уменьшения объема вычислений для шифрования и сокращения сетевого трафика.
Электронно-цифровая подпись может быть сформирована на основе различных методов двухключевой криптографии, например, RSA, Эль-Гамаля, эллиптических кривых.
Схема аутентификации на основе сертификата.
Данная схема предполагает наличие третьей стороны, называемой УЦ – удостоверяющим центром или ЦС – центром сертификации, которая выдает удостоверения (сертификаты) всем участникам сетевого домена, входящего в зону действия данного ЦС. При регистрации нового пользователя или сервера в домене ЦС выдает новому участнику сертификат, состоящий из открытой части, содержащий такие данные как:
1. Идентификатор владельца сертификата,
2. Адрес владельца сертификата,
3. Открытый ключ владельца сертификата,
4. Категория владельца сертификата (например, пользователь с ограниченными полномочиями или администратор проекта).
5. Наименование ЦС и его адрес,
6. Алгоритмы, используемые для генерации ключей и формирования ЭЦП, и их версии,
и закрытой части, содержащий ту же информацию, закрепленной электронно-цифровой подписью ЦС (т.е. подвергнутого хеш- преобразованию и последующему шифрованию с помощью закрытого ключа ЦС).
Обе части выдаются соискателю в электронном виде в виде одного файла. Закрытая часть служит для того, чтобы нельзя было подделать сертификат.
Кроме того, соискатель получает отдельно закрытый ключ, соответствующий открытому ключу, находящемуся в сертификате, который соискатель обязуется хранить в секрете.
Кроме того, открытая часть сертификата может выдана в виде бумажного документа, подтвержденного печатью ЦС.
При обмене сообщения каждый участник сопровождает свое послание меткой времени, электронно-цифровой подписью, сформированной на основе своего закрытого ключа, и сертификатом, выданным ему ЦС. Сертификат здесь служит для удостоверения ЭЦП отправителя: получатель подписывает своим закрытым ключом послания, а получатель расшифровывает ЭЦП, используя открытый ключ отправителя, извлеченный из сертификата. Подлинность сертификата подтверждается электронно-цифровой подписью ЦС, которая может быть проверена с помощью расшифровки закрытой части сертификата с использованием открытого ключа ЦС, который является общедоступным.
Программирование хеш-функций в Delphi
Система Delphi обращается к встроенным средствам операционной системы Windows для программирования различных функций хеширования, методов шифрования с использованием классической и двухключевой криптографии. Большинство этих средств содержится в библиотеках advapi32.dll и crypt32.dll, которые должны быть подключены к проекту Delphi. Для этого в проект приложения надо добавить модуль Wcrypt2.pas, который можно скачать по адресу
http://www.delphikingdom.com/zip/headerCryptoAPI.rar. Как воспользоваться этим модулем в проекте Delphi можно прочитать в статье Ю.Спектора
http://www.delphikingdom.com/asp/viewitem.asp?catalogID=1271.
Если нет необходимости использовать все возможности этих библиотек, то можно воспользоваться готовой программой для хеш-функции MD5 (см. прил.в конце).
Указания к выполнению лабораторной работе.
Лабораторная работа 4 состоит из двух частей, каждая из которых выполняется в одной форме Delphi.
¨ В первой части следует разработать клиент-серверное приложение для удаленной аутентификации пользователей на компьютере-сервере согласно номеру своего варианта. Для этого используйте разработку, выполненную в лабораторной работе 2.
¨ Во второй части надо выполнить написать приложение, представляющее работу Центра Сертификации X.509 по выдаче сертификатов X.509 другим пользователям сети по их запросам.
ВАРИАНТЫ ЗАДАНИЙ
Четные варианты. Разработать приложение, осуществляющее аутентификацию пользователей на основе слова-вызова.
Нечетные варианты. Разработать приложение, осущеставляющее аутентификацию пользователей на основе электронно-цифровой подписи, генерируемой с помощью метода RSA.
1. Что такое аутентификация? Перечислите основные методы аутентификации.
2. Что такое хеш-преобразование? Перечислите основные свойства хеш-функций.
3. В чем заключается аутентификация на основе слова-вызова?
4. Что такое электронно-цифровая подпись? Как она формируется?
5. Как выполняется проверка послания, подписанного ЭЦП?
6. Что такое сертификация X.509? Каковые преимущества имеет аутентификация на основе сертификатов по сравнению с другими видами сертификации?
7. Что входит в состав сертификата ?
8. Какие основные фунции выполняется Центр Сертификации X.509?
9. Сколько различных ключей используется в процедуре аутентификация на основе сертификатов, и каким образом распространяются эти ключи?
10. Каким образом осуществляется проверка подлинности сертификата?
Приложение 1. Текст хеш-функции MD5.
Function md5(s:string):string;
var a:array[0..15] of byte;
i:integer; lenhi, lenlo: longword;
index: dword;
hashbuffer: array[0..63] of byte;
currenthash: array[0..3] of dword;
procedure burn;
begin
lenhi:= 0; lenlo:= 0; index:= 0;
fillchar(hashbuffer,sizeof(hashbuffer),0);
fillchar(currenthash,sizeof(currenthash),0);
end;
procedure init;
begin
burn; currenthash[0]:= $67452301;
currenthash[1]:= $efcdab89;
currenthash[2]:= $98badcfe;
currenthash[3]:= $10325476;
end;
function lrot32(a, b: longword): longword;
begin
result:= (a shl b) or (a shr (32-b));
end;
procedure compress;
var data: array[0..15] of dword;
a, b, c, d: dword;
Begin
move(hashbuffer,data,sizeof(data));
a:= currenthash[0]; b:= currenthash[1];
c:= currenthash[2]; d:= currenthash[3];
a:= b + lrot32(a + (d xor (b and (c xor d))) + data[ 0] + $d76aa478,7);
d:= a + lrot32(d + (c xor (a and (b xor c))) + data[ 1] + $e8c7b756,12);
c:= d + lrot32(c + (b xor (d and (a xor b))) + data[ 2] + $242070db,17);
b:= c + lrot32(b + (a xor (c and (d xor a))) + data[ 3] + $c1bdceee,22);
a:= b + lrot32(a + (d xor (b and (c xor d))) + data[ 4] + $f57c0faf,7);
d:= a + lrot32(d + (c xor (a and (b xor c))) + data[ 5] + $4787c62a,12);
c:= d + lrot32(c + (b xor (d and (a xor b))) + data[ 6] + $a8304613,17);
b:= c + lrot32(b + (a xor (c and (d xor a))) + data[ 7] + $fd469501,22);
a:= b + lrot32(a + (d xor (b and (c xor d))) + data[ 8] + $698098d8,7);
d:= a + lrot32(d + (c xor (a and (b xor c))) + data[ 9] + $8b44f7af,12);
c:= d + lrot32(c + (b xor (d and (a xor b))) + data[10] + $ffff5bb1,17);
b:= c + lrot32(b + (a xor (c and (d xor a))) + data[11] + $895cd7be,22);
a:= b + lrot32(a + (d xor (b and (c xor d))) + data[12] + $6b901122,7);
d:= a + lrot32(d + (c xor (a and (b xor c))) + data[13] + $fd987193,12);
c:= d + lrot32(c + (b xor (d and (a xor b))) + data[14] + $a679438e,17);
b:= c + lrot32(b + (a xor (c and (d xor a))) + data[15] + $49b40821,22);
a:= b + lrot32(a + (c xor (d and (b xor c))) + data[ 1] + $f61e2562,5);
d:= a + lrot32(d + (b xor (c and (a xor b))) + data[ 6] + $c040b340,9);
c:= d + lrot32(c + (a xor (b and (d xor a))) + data[11] + $265e5a51,14);
b:= c + lrot32(b + (d xor (a and (c xor d))) + data[ 0] + $e9b6c7aa,20);
a:= b + lrot32(a + (c xor (d and (b xor c))) + data[ 5] + $d62f105d,5);