CFA LogoCFA Logo Computer
Загрузка поиска
Новости Компьютеры Прайс-лист [Новое] Прайс-лист [Б/У] Для ноутбуков Конфигуратор ПК Заказ, Оплата, Доставка Сервис объявления Драйвера Статьи Как нас найти Контакты
Новости
RSS канал новостей
То, что энтузиасты ждали так долго, наконец-то случилось, и компания NVIDIA анонсировала свой новый ...
Официальный анонс графического ускорителя GeForce GTX 1080 Ti состоялся 1 марта, и партнеры NVIDIA ...
Компания ASRock представила мировой общественности материнскую плату H110-STX MXM, которая рассчитана ...
Компания MSI в рамках серии Arsenal Gaming представляет пользователям материнские платы линейки ...
По данным наших коллег, в этом месяце компания Huawei официально представит свой новый смартфон. ...
Самое интересное
Программаторы 25 SPI FLASH Адаптеры Optibay HDD Caddy Драйвера nVidia GeForce Драйвера AMD Radeon HD Игры на DVD Сравнение видеокарт Сравнение процессоров

АРХИВ СТАТЕЙ ЖУРНАЛА «МОЙ КОМПЬЮТЕР» ЗА 2002 ГОД

Мышление в стиле Visual Basic

Андрей ГОНЧАРОВ ag@ukr.net

(Продолжение, начало см. в МК № 6, 9—10, 19, 25, 27, 29—30, 33, 36—38, 45, 48, 3, 6—7 (125, 128—129, 138, 144, 146, 148—149, 152, 155—157, 164, 167, 174, 177—178))

Итак, приступим к объявлению и вызову функции, формирующей для нас хеш. Она носит имя CryptCreateHash.

Первый аргумент, передаваемый этой функции, несет описатель (дескриптор) контекста CSP, открытый функцией CryptAcquireContext (см. прошлые уроки); второй представляет собой собственно алгоритм формирования хеша (например одним из наиболее популярных считается MD5. В таблице ниже приведены доступные, по состоянию на декабрь 2001 г., ID алгоритмов хеширования); третий является дескриптором ключа шифрования (см. далее), используемого для работы с алгоритмами MAC (Message Authentication Code) и HMAC; четвертый зарезервирован и ожидает передачу &H0 (т. е. нуля); пятый, phHash, станет контейнером для полученного дескриптора хеш-объекта (см. ниже). В дальнейшем приложение, оперирующее неким хеш-объектом, будет иметь дело именно со значением этой переменной.

CALG_MD2 Алгоритм хеширования MD2

CALG_MD4 Алгоритм хеширования MD4

CALG_MD5 Алгоритм хеширования MD5

CALG_SHA Алгоритм Secure Hash Algorithm

CALG_SHA1 Усовершенствованный алгоритм SHA

CALG_MAC Алгоритм хеширования Message Authentication Code

CALG_SSL3_SHAMD5 Алгоритм хеширования SSL3 (Secure Socket Layer 3), включающий SHA и MD5

CALG_HMAC Алгоритм хеширования HMAC

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

Собственно искомый результат — хеш — будет храниться в переданной по ссылке переменной phHash. Эту переменную и следует использовать в тех функциях, которые оперируют хеш-объектом для шифрования данных.

Что можно сделать с полученным хеш-объектом?

Во-первых, забегая вперед, скажу, что операции с данными на уровне API всегда чреваты передачами их по ссылке в другие функции, так что вполне возможна ситуация, когда вы можете безвозвратно утерять полученный хеш. Более того, исходя из принципов применения хеш-объектов, а также из некоторых обстоятельств, о которых будет сказано ниже, логично допустить, что неплохо бы сохранять копию хеша. Итак, копирование хеш-объекта можно произвести путем применения функции CryptDuplicateHash. Функция, принимающая четыре параметра-аргумента, два из которых зарезервированы, помещает в один из них новый, сдублированный хеш-объект. Для реализации этой операции требуется как минимум копируемый экземпляр.

Первый аргумент, hHash, является тем хеш-объектом, который требуется скопировать. Четвертый аргумент, phHash, передаваемый по ссылке, будет содержать копию. Второй и третий лучше не тревожить, — передавайте нули.

Во-вторых, получение хеш-объекта предполагает в дальнейшем его использование, не так ли? Значит, где-то в двоичных дебрях Advapi32.dll должна жить функция, хеширующая данные на основе этого самого пресловутого хеш-объекта. Запутались? Объясню: хеш-объект есть описатель, дескриптор некоего объекта, инструкции, если хотите, для хеширующей функции, чтобы та, принимая его в качестве одного из аргументов, имела в виду правила и установки хеширования. Итак, хеширующая функция, собственно выполняющая полезную работу, должна получить дескриптор хеш-объекта, хешируемую информацию (в формате String), длину этой информации (конечно, Long!) и, если таковые есть, опции. Как вы уже, вероятно, догадались, опциями здесь называются числовые значения, оформленные как константы типа Long. Еще раз забегу вперед: в данной функции опциям лучше назначить значение 0 (или так: &H0).

Вот как все это выглядит в разрезе вызова ее из-под VB 6.0:

Вот мы и захешировали данные. Да, можно, не прибегая к выявлению текущего значения хеша, передавать куда нужно его дескриптор, однако часто бывает просто необходимо знать его параметры — длину хеш-объекта, текущее значение и алгоритм, которым «замусорили» информацию. Все, чего так хочет функция CryptGetHashParam, это переданный по значению дескриптор хеш-объекта (а по чем еще судить-то?); параметры, переданные в качестве констант (HP_ALGID = &H1, HP_HASHSIZE = &H4, HP_HASHVAL = &H2) — 1, 2 или 4; контейнер для хеша (передача — по ссылке!, т. е. ByRef, или же просто без явного указания способа передачи); и ноль как последний зарезервированный аргумент. Таким образом, создавая хеш-объект при помощи CryptCreateHash, мы имеем возможность узнать, например, каким алгоритмом были захешированы данные, а также текущие данные о самом хеше. Однако здесь есть один нюанс, из-за которого вам все же, скорее всего, придется сперва дублировать хеш-объект: после извлечения информации хеш-объект «умерщвляется», маркируется как отработанный. Естественно, в целях безопасности. Объявление функции выглядит так:

Кроме пречисленных действий над хеш-объектом существует также установка параметров хеш-объекта, которую мы и рассмотрим. На этом тему хешей можно будет считать пройденной.

Ситуация, когда необходимо выполнить установку параметров хеш-объекту, вполне реальна: при попытке хеширования данных алгоритмом с ID CALG_SSL3_SHAMD5 приходится создавать два дополнительных хеш-объекта, каждый из которых настроен на свой алгоритм, после чего объединенная информация об объектах поступает в функцию. Объявление функции приведено ниже:

Что передается в функцию?

Читатель уже, вероятно, догадался, что по аналогии с другими функциями этого разряда hHash, первый аргумент представляет собой дескриптор хеш-объекта, который берется не откуда-нибудь, а из переданного по ссылке параметра функции CryptCreatehash (см. иллюстрацию-схему). Вторым параметром является один из вариантов — либо передается значение типа HMAC_INFO — для использования алгоритма HMAC, либо устанавливается значение хеша. Для первого случая это &H5, для второго —&H2. Третий параметр — это собственно данные, передаваемые для обработки. Если здесь передаются данные об алгоритме кодирования, функцию следует объявлять с использованием псевдонима (Alias), причем имя функции звучит как CryptSetHashDWParam, в этом случае псевдоним будет повторять ранее указанное. Третий параметр — pbData — передается по ссылке.

Тип HMAC_INFO — тип данных, который вы обязаны описать в модуле:

Следующий урок CryptoAPI будет посвящен непосредственному использованию хешей — формированию паролей (или ключей, если выражаться более «технично») для использования в агоритмах симметричного шифрования. Вы узнаете, какие варианты предоставлены программистам при выборе алгоритмов шифровании (провайдер Microsoft Base CryptoGraphic Provider v. 1.0), как происходит формирование ключа и какие опции можно выставить, будут рассмотрены вопросы дублирования и уничтожения ключей, а также функции шифрования и расшифровки по Microsoft...

(Продолжение следует)

Рекомендуем ещё прочитать:






Данную страницу никто не комментировал. Вы можете стать первым.

Ваше имя:
Ваша почта:

RSS
Комментарий:
Введите символы: *
captcha
Обновить






Рейтинг@Mail.ru
Хостинг на серверах в Украине, США и Германии. © www.sector.biz.ua 2006-2015 design by Vadim Popov