русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Шаг 18 - Генерация хешей MD2, MD4, MD5 с помощью OpenSSL


Дата добавления: 2015-07-04; просмотров: 693; Нарушение авторских прав


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

Набор хеш-функций MD2, MD4 и MD5 в библиотеке OpenSSL используется для вычисления хешей данных. Для тех, кто не знает, что такое хеш, возможно будет более понятным термин контрольная сумма или чексумма (от англ. checksum). Это число генерируется на основе содержимого данных и используется в основном для проверки целостности данных. Все алгоритмы вычисления хешей разрабатывались таким образом, чтобы даже при изменении одного бита данных результирующий хеш менялся до неузнаваемости, по сравнению с первоначальным. Причем по хешу данных (по понятным причинам необратимости работы алгоритма) предсказать содержимое данных невозможно.

root@localhost:/home/dron# echo -n "Arnold Schwarzenegger" | md5sumc8d96c6f9a91ba729ca1688f90f6d2b7 -root@localhost:/home/dron# echo -n "Brnold Schwarzenegger" | md5sumc0707d286aaadc1a8c1f5e77cb5a4961 -

Этим свойством можно пользоваться для реализации процесса аутентификации без передачи идентификационных данных по сети в открытом виде. Наиболее наглядным примером использования хеш-функции MD5 является реализация алгоритма защищенной проверки пароля APOP в протоколе POP3. Все тонкости работы алгоритма я описывать не буду, только основные моменты и сам принцип.

Реализация APOP в POP3 позволяет произвести проверку пароля между сервером и клиентом без передачи пароля в открытом виде. Идея проста и заключается в том, что обе стороны (сервер и клиент) изначально пароль знают, да в общем-то другого и быть не может :) Сервер во время подключения клиента к своему приглашению добавляет слово-сальт (словом salt в терминах Юникса обозначается префикс используемый для шифрования паролей DES). Сальт меняется сервером периодически, для этого можно использовать текущее время в секундах, идентификатор процесса или просто случайное число. Это слово-сальт клиент добавляет к паролю и потом передает хеш-функцию MD5 от полученной строки серверу. Сервер производит такую же операцию и сравнивает результат работы MD5 с переданным хешем от клиента. Таким образом получается, что пароль в открытом виде не передается, а по передаваемому хешу практически не возможно подобрать пароль.



Библиотека OpenSSL для работы с хешами предоставляет множество различных по скорости работы и криптостойкости алгоритмов. Я приведу пример работы с семеством Message-Digest (MD) алгоритмов, в которое входят алгоритмы MD2, MD4 и MD5. Набор функций для работы с ними одинаковы и отличаются соответственно названиями:

· MD*_Init() - инициализация контекста для хеширования.

· MD*_Update() - обновление контекста новыми данными.

· MD*_Final() - выработка конечного хеша.

· MD*() - обобщенная функция для хеширования.

Для работы с этими алгоритмами необходимо подключить соответствующий заголовочный файл, например для MD5:

#include <openssl/md5.h>

Выработка хеша делается следующим образом (для примера возьмем последовательность 0123456789):

/* start main.c */#include <stdio.h>#include <stdlib.h>#include <openssl/md5.h> int main() { int i; MD5_CTX md5handler; unsigned char md5digest[MD5_DIGEST_LENGTH]; MD5_Init(&md5handler); MD5_Update(&md5handler, "01234", 5); MD5_Update(&md5handler, "56789", 5); MD5_Final(md5digest,&md5handler); for (i=0;i<MD5_DIGEST_LENGTH;i++) { printf("%02x",md5digest[i]); }; printf("\n"); return 0;};/* end of main.c */

Компилируем:

gcc main.c -lcrypto

Пробуем:

root@localhost:/home/dron# ./a.out781e5e245d69b566979b86e28d23f2c7

Для проверки результата работы можно использовать команду md5sum:

root@localhost:/home/dron# echo -n "0123456789" | md5sum781e5e245d69b566979b86e28d23f2c7 -

Как видите совпадает. Этим набором функций можно хешировать большие объемы данных последовательно вызывая MD5_Update:

void MD5_Update(MD5_CTX *c, const void *data, unsigned long len);

Но, если Вам требуется хешировать небольшие объемы данных целиком помещающиеся в буфер, то можно пользоваться упрощенной функцией:

unsigned char *MD5(const unsigned char *d, unsigned long n, unsigned char *md);

Пример:

#include <stdio.h>#include <stdlib.h>#include <openssl/md5.h> int main() { int i; MD5_CTX md5handler; unsigned char md5digest[MD5_DIGEST_LENGTH]; MD5("0123456789",10, md5digest); for (i=0;i<MD5_DIGEST_LENGTH;i++) { printf("%02x",md5digest[i]); }; printf("\n"); return 0;};

Получается более компактное и красивое решение.

Использовать алгоритмы MD2 и MD4 можно аналогично, хотя сегодня они практически нигде не применяются, так как являются более старыми версиями.

 



<== предыдущая лекция | следующая лекция ==>
Шаг 17 - Работа с переменными окружения - setenv и getenv | Регистрационная форма участника конференции


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.226 сек.