Защита приложений при помощи AIX 5L версий 5.2 и 5.3 с использованием криптографических API-интерфейсов

Необходимо, чтобы ваши приложения обладали возможностями для обеспечения проверки целостности, подлинности и секретности данных? Операционные системы IBM AIX 5L™ версий 5.2 и 5.3 (AIX 5L) предоставляют мощные криптографические API-интерфейсы для разработки безопасных приложений. AIX 5L предлагает набор мощных криптографических API-интерфейсов, предназначенных для работы с алгоритмами шифрования, использующих симметричные и ассиметричные ключи. Эти интерфейсы предоставляют блочные и потоковые алгоритмы шифрования и два метода хеширования с шифрованием: алгоритм обмена ключами Диффи-Хеллмана и алгоритмы регистрации и/или подтверждения (sign and /or verify algorithms).

Прашант Содхийя, программист, IBM

Прашант Содхийя (Prashant Sodhiya) - разработчик программного обеспечения в IBM India Software Labs. В настоящее время он создает новые возможности и сопроводительную документацию для IBM Network Authentication Service (Службы Сетевой Аутентификации IBM, IBM Kerberos). Перед тем как присоединиться к IBM, он три года работал в Centre for Development of Advanced Computing (CDAC). В этой компании он занимался сетевой безопасностью. Прашант имеет диплом бакалавра в области компьютерных наук Университета Гвалиора (University of Gwalior), Индия. Связаться с ним можно по адресу psodhiya@in.ibm.com.



Сендип Рамеш Патил, штатный инженер по программному обеспечению, IBM

Сендип Рамеш Патил (Sandeep Ramesh Patil) работает штатным инженером по программному обеспечению в IBM India Software Labs. Последние пять лет его работа в IBM в основном связана с распределенными технологиями, включая DCE, SARPC, и продуктами по обеспечению безопасности, такими как IBM Network Authentication Services (IBM Kerberos). В данный момент он работает над новым RFC по безопасности для IBM Network Authentication Service параллельно с поддержкой этих продуктов. Сендип имеет степень бакалавра в области информационных технологий и технологий, полученную в университете Пуны, Индия. С ним можно связаться по e-mail rsandeep@in.ibm.com.



29.10.2008

Введение

Применение криптографических API-интерфейсов AIX 5L™ версий 5.2 и 5.3 (AIX 5L) требует от разработчиков во время программирования выполнять определенную последовательность действий. В этой статье будут рассмотрены основные криптографические возможности, предоставляемые AIX 5L, а также будут исследованы фрагменты программного кода, которые покажут, как использовать этот интерфейс. AIX 5L предлагает эти интерфейсы в библиотеке libmodcrypt.a (которая находится в наборе файлов modcrypt.base), а объявления функций - в файле xcrypt.h. Перед тем как использовать эти криптографические интерфейсы, необходимо установить набор файлов modcrypt.base с Expansion Pack CD для AIX® версий 5.2 и/или 5.3.


Интерфейсы для хеширования

Алгоритм хеширования принимает данные переменной длины и создает профиль сообщения (строку, идентифицирующую сообщение) фиксированной длины. Когда для генерации профиля сообщения используется односторонний алгоритм хеширования, входные данные не могут быть определены из выходных. В различных стандартах и приложениях наиболее часто используются два алгоритма хеширования: MD5 и SHA-1. AIX 5L предоставляет API-интерфейсы xcrypt_hash() и crypt_hmac(), которые поддерживают оба вышеупомянутых алгоритма хеширования. В листинге 1 и листинге 2 показано, как можно использовать эти интерфейсы в приложении.

Листинг 1. xcrypt_hash()
/* фрагмент кода с использованием xcrypt_hash() */

/* сообщение, которое надо хешировать */ 
u_char *plain_data = "This is a sample message";
 
u_char hash_data[128];

 /* 
  * будет выполнено хеширование содержимого буфера 'plain_data',
     и его профиль будет сохранен в буфер 'hash_data' 
  */

 /* ниже 'plain_data' хешируется алгоритмом MD5.
    Также поддерживается алгоритм SHA1 */

 if( xcrypt_hash( MD5, plain_data, strlen(plain_data), hash_data) <0 )

      printf("\n xcrypt_hash() failed. ");

           

 /* распечатка профиля в шестнадцатеричном формате */

  printf("\n Hash of the data : "); xcrypt_printb(hash_data, strlen(hash_data));

  

 Program output:

Hash of the data : B00BEC976AD74F785DAAA810B8FCA81EF02344482FF22C18F01EA068
Листинг 2. xcrypt_hmac()
/* фрагмент кода с использованием xcrypt_hmac() */


 /* сообщение которое нужно хешировать */
 u_char        *plain_data = "This is a sample message";

 u_char        hash_data[256];

 u_char        *key="12345678";

 xcrypt_key    hash_key;

  /* настройка таблицы ключей для hmac */
  if(  xcrypt_key_setup(HMAC_MD5, &hash_key, key, KEY_128, NULL) != 0 )

     printf("\n xcrypt_key_setup failed.");

 /* 
  * будет выполнено хеширование содержимого буфера 'plain_data',
     и его профиль будет сохранен в буфер 'hash_data' 
  */

 /* Здесь 'plain_data' хешируется алгоритмом HMAC-MD5.
     Другой поддерживаемый алгоритм HMAC-SHA1.
  */

 if( xcrypt_hmac(HMAC_MD5, &hash_key, plain_data, strlen(plain_data), 

 	hash_data, TRUE) <0 )

     printf("\n xcrypt_hmac() failed.");



/* распечатка профиля в шестнадцатеричном формате */
 printf("\n Hash of the data : "); xcrypt_printb(hash_data, strlen(hash_data));



Program output:

Hash of the data : 2A27303CCBD4689C61E861EA6C0C6B56

Интерфейсы для шифрования и/или дешифрования

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

Два главных типа шифрования: ассиметричный тип шифрования (также называемый шифрованием с открытым ключом) и симметричный тип шифрования (также называемый шифрованием с секретным ключом).

AIX 5L представляет интерфейсы xcrypt_encrypt() и xcrypt_decrypt(). Эти интерфейсы поддерживают симметричное шифрование. Также эти интерфейсы поддерживают следующие "продвинутые" алгоритмы симметричного шифрования:

  • Симметричный алгоритм блочного шифрования (AES) - поддерживает ключи размерами 128, 192 и 256 бит.
  • Алгоритм блочного шифрования Mars - поддерживает ключи размерами 128, 192 и 256 бит.
  • Алгоритм блочного шифрования Twofish - поддерживает ключи размерами 128, 192 и 256 бит.
  • Алгоритм поточного шифрования SEAL - поддерживает ключи размерами 128, 192 и 256 бит.
  • Блочный алгоритм шифрования Triple Data Encryption Standard (Triple DES) - поддерживает ключи размерами 64 и 128 бит.
  • Алгоритм Data Encryption Standard (DES) - поддерживает ключи размером 64 бита.
  • Алгоритм шифрования CAST - поддерживает ключи размерами 40, 80 и 128 бит.

В листинге 3 показано, как можно использовать эти интерфейсы для шифрования данных приложения.

Листинг 3. xcrypt_encrypt() и xcrypt_decrypt()
/* фрагмент кода с использованием xcrypt_encrypt() и xcrypt_decrypt() */

 u_char        *plain_data = "This is sample message";

 u_char         enc_data[128], dec_data[128], *key = "secretKy", *iv ;

 xcrypt_key     enc_key, dec_key;

  int            enc_size, dec_size;

 /* настройка ключей для шифрования */

 if( xcrypt_key_setup( CAST5, &enc_key, key, KEY_128, DIR_ENCRYPT) < 0 )

      printf("\n xcrypt_key_setup failed.");

 /* распечатка сообщения, которое нужно зашифровать */

 printf(" Plain data : %s", plain_data);

 printf("\n Plain data in HEX : "); 

 xcrypt_printb(plain_data,strlen(plain_data));

 /* настройка вектора инициализации для режима CBC */

 iv=(u_char *)malloc(8);

 memset(iv, '1', 8);


 /* Шифрование содержимого буфера 'plain_data' в буфер 'enc_data' */
 /* Используется алгоритм типа CAST5. 
     Также поддерживаются алгоритмы: RIJNDAEL(AES), MARS, SEAL,  *DES, TDES и TWOFISH   */

 if( (enc_size = xcrypt_encrypt( CAST5, MODE_CBC, &enc_key, iv,

 		 plain_data, strlen(plain_data), enc_data, TRUE)) <0 )

     printf("\n xcrypt_encrypt failed.");

  /* распечатка зашифрованных данных в шестнадцатеричном формате */
  printf("\n Encrypted data : "); xcrypt_printb(enc_data, enc_size);

 /* настройка ключей для дешифрования */
 if( xcrypt_key_setup( CAST5, &dec_key, key, KEY_128, DIR_DECRYPT) <0)

    printf("\n xcrypt_key_setup failed.");

 /* перенастройка инициализирующего вектора */
 memset(iv, '1', 8);
 
 /* расшифровка содержимого буфера 'enc_data' в буфер 'dec_data' */
 if( (dec_size = 

 xcrypt_decrypt( CAST5, MODE_CBC, &dec_key, iv, enc_data, enc_size,

                     dec_data, TRUE)) <0)

     printf("\n xcrypt_decrypt failed.\n");



  /* распечатка расшифрованных данных */

 printf("\n Decrypted data : %s",dec_data);

 printf("\n Decrypted data in HEX : "); xcrypt_printb(dec_data,dec_size);

 
 /* сравнение расшифрованных данных с исходными данными */

 if(strncmp(plain_data, dec_data, dec_size) != 0)

     printf("\n decrypt Failed\n");



Program output:

 Plain data : This is sample message

 Plain data in HEX : 546869732069732073616D706C65206D657373616765

 Encrypted data : 3BEEE070429F65B13498F3943F53A2A2099CA40D6960188D

 Decrypted data : This is sample message

 Decrypted data in HEX : 546869732069732073616D706C65206D657373616765

Интерфейсы для обмена ключами

Протокол согласования общего секретного ключа Диффи-Хеллмана (Diffie-Hellman) был разработан Диффи и Хеллманом [DH76] в 1976 г. и опубликован в новаторской статье New Directions in Cryptography (см. раздел Ресурсы). Протокол позволяет двум пользователям генерировать секретный ключ, используя незащищенный канал связи. Иначе говоря, этот протокол описывает, как две стороны могут договориться о содержимом общего секретного ключа и при этом секрет будет недоступен третьей, шпионящей стороне.

IBM AIX 5L предлагает набор эффективных процедур xcrypt_dh_keygen() и xcrypt_dh(), которые позволяют реализовать в приложениях мощь алгоритмов Диффи-Хеллмана для обмена ключами. Данные процедуры должны использоваться в определенной последовательности, как показано в листинге 4.

Листинг 4. xcrypt_dh_keygen() и xcrypt_dh()
/* фрагмент кода с использованием xcrypt_dh_keygen() и xcrypt_dh() */

	 void    *prvA = NULL, *prvB = NULL;

     u_char  pubA[KEY_1024], pubB[KEY_1024], secretA[KEY_1024], 

     secretB[KEY_1024];

     int     sizeA, sizeB;

    /* Генерация секретного Д-Х ключа для стороны А.
        При этом используются параметры по умолчанию алгоритма Д-Х для AIX.  */

    if (xcrypt_dh_keygen(&prvA, KEY_512) != 0)

            printf("xcrypt_dh_keygen() for A failed.\n");



    /* Генерация секретного Д-Х ключа для стороны B.
        При этом используются параметры по умолчанию алгоритма Д-Х для AIX.  */
    if (xcrypt_dh_keygen(&prvB, KEY_512) != 0)

            printf("xcrypt_dh_keygen() for B failed.\n");



    /* Генерация открытого Д-Х ключа для A. */
    if (xcrypt_dh(prvA, NULL, pubA) < 0)

            printf("xcrypt_dh() for A failed.\n");



    /* Генерация открытого Д-Х ключа для B. */
    if (xcrypt_dh(prvB, NULL, pubB) < 0)

            printf("xcrypt_dh() for B failed.\n");



    /* Генерация общего секретного ключа для A с использованием 
	    секретного Д-Х ключа А и открытого Д-Х ключа B.*/

    if ( (sizeA = xcrypt_dh(prvA, pubB, secretA)) <0)

            printf("xcrypt_dh() for A failed.\n");



    /* Генерация общего секретного ключа для B с использованием 
	    секретного Д-Х ключа B и открытого Д-Х ключа A.*/

    if ( (sizeB = xcrypt_dh(prvB, pubA, secretB)) < 0)

            printf("xcrypt_dh() for B failed.\n");

   printf("\n  secretA = ");xcrypt_printb(secretA,sizeA);

   printf("\n  secretB = ");xcrypt_printb(secretB,sizeB);

   printf("\n");

    if ((memcmp(secretA, secretB, sizeA)) != 0)

        printf("Memcmp failed.\n");


Program output:

secretA :  02D5F2A4BECA32CDE7CB2E0AC0A7232BAC7C715F6D7143286

E7076762C0421FB94A33C579EA33AE44FCF80F501AF907716C6923

          EA721F01A4EA55868AEB5AD46

secretB = 02D5F2A4BECA32CDE7CB2E0AC0A7232BAC7C715F6D7143286

E7076762C0421FB94A33C579EA33AE44FCF80F501AF907716C6923

          EA721F01A4EA55868AEB5AD46

Интерфейсы для цифровой подписи и верификации данных

Цифровая подпись (или цифровая подпись на основе общего ключа) - это способ аутентификации цифровой информации, аналогичный обыкновенным подписям на бумаге. Данный метод реализуется при помощи техник из области криптографии с открытым ключом. Метод с использованием цифровой подписи по сути определяет два дополнительных алгоритма: один для создания подписи, другой для верификации. Результат процесса подписи и называется цифровой подписью. AIX 5L предлагает API-интерфейсы xcrypt_sign() и xcrypt_verify(). Данные методы можно использовать в пользовательских приложениях для подписи цифровых данных (при помощи механизмов с общим ключом) и проверки цифровой подписи, ассоциированной с данными.

Чтобы использовать эти API-интерфейсы, необходимо настроить инфраструктуру для хранения открытых ключей (PKI). AIX 5L предоставляет эту инфраструктуру. Более подробная инструкция о настройке PKI на AIX содержится в главе 9 руководства AIX 5L Differences Guide Version 5.2 Edition.

В листинге 5 показано, как создать цифровую подпись данных, а потом проверить её подлинность.

Листинг 5. Применение xcrypt_sign() и xcrypt_verify()
/* Фрагмент кода с использованием xcrypt_sign() и xcrypt_verify() */ 

u_char        *plain_txt = "If you can get this your crypto works fine";

uint8_t       *cert = NULL, *prv_key=NULL, signature[2048];  ;

int            cert_size = 0,  prv_size=0, sigSize=0, retval; ;

xcrypt_key     prv, pub ;

/* Настройка ключей для подписывания сообщения. */

/*
 * Здесь используется алгоритм RSA (RSAwithMD5), также поддерживается
 * алгоритм подписи DSA (DSAwithSHA1).

 * Передача соответствующего секретного ключа RSA/DSA (PKCS#8), 
 * полученного из любой криптосистемы, в переменную 'prv_key'. 
 */
 
    if (retval= xcrypt_key_setup(RSA, &prv, prv_key, prv_size, NULL))

       printf("\nxcrypt_key_setup() failed.\n"); 



    /* Генерация цифровой подписи для данных в переменной 'plain_txt' */


    if ((sigSize = 

    xcrypt_sign(RSA, &prv,  plain_txt, strlen(plain_txt) , signature)) < 0)

       printf("\nxcrypt_sign() failed.\n");

    else

       printf("\nxcrypt_sign() passed.\n"); 



    printf("\nSignature : ");xcrypt_printb(signature,sigSize); 


   /* Настройка ключей для верификации подписи. */

  /* 
   * Передаем X509_CERT в качестве типа алгоритма 'alg_type' и 
   * сам сертификат в переменной 'cert', так как не известно, 
   * какой алгоритм   использовался для подписи. 
   */

    if (retval = xcrypt_key_setup(X509_CERT, &pub, cert, cert_size, NULL))

       printf("\nxcrypt_key_setup() failed.\n"); 


    /* Проверка цифровой подписи для данных в переменной 'plain_txt' */

    if ((retval= xcrypt_verify( X509_CERT , &pub,  plain_txt, 

    strlen(plain_txt), 

    	signature, sigSize)) == 1)

       printf("\n\nxcrypt_verify() passed.\n");

    else

       printf("\n\nxcrypt_verify() failed.\n"); 



Program output:

xcrypt_sign() passed. 



Signature : 1F72501A233F80FEF98444BE4BEF47284DB297987F079C9D4E1EFFEF

4659B97E1BB22280C212C4C712C4EBBA05FF4178D

B1D09DB9420E5F386F5C859B4826F0C45532F33484A616236B7622B

8CA2FFB94503EFF82BAE5B27F82F5B2F98CFEB68C1

C21F44677B5A643A2E992FEDFA803BC53BC7DCC04D72808E

            F3E631EAED53CB



xcrypt_verify() passed.

Примечание. Примеры программного кода, приведенные выше, были созданы в IBM VisualAge® C++ Professional / C for AIX Compiler Version 6 и протестированы в AIX версии 5.3.


Заключение

Службы безопасности обеспечивают аутентификацию, целостность, и секретность приложений. В этой статье было показано, как использовать набор криптографических API-интерфейсов, предоставляемых AIX 5L 5.2 и 5.3, для реализации служб безопасности. При разработке безопасных модулей и/или приложений на AIX следует подумать об использовании API-интерфейсов.

Ресурсы

Научиться

Получить продукты и технологии

  • Средства разработки приложений и промежуточное ПО с DB2®, Lotus®, Rational®, Tivoli®, и WebSphere®. Можно бесплатно загрузить пробные версии этих продуктов или выбрать Linux® или Windows®-версию - комплект приложений сообщества developer Works (developerWorks' Software Evaluation Kit).(EN)
  • IBM trial software: ознакомительные версии программного обеспечения для разработчиков, которые можно загрузить прямо со страницы сообщества developerWorks.(EN)

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы в первый раз заходите в developerWorks. Выберите данные в своем профиле (имя, страна/регион, компания) которые будут общедоступными и будут отображаться, когда вы публикуете какую-либо информацию. Вы можете изменить данные вашего ИБМ аккаунта в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=AIX и UNIX
ArticleID=348470
ArticleTitle=Защита приложений при помощи AIX 5L версий 5.2 и 5.3 с использованием криптографических API-интерфейсов
publish-date=10292008