IBM®
Перейти к тексту
    в России и странах СНГ [изменить]    Условия использования
 
 
   
    Главная страница    Продукты    Услуги и решения    Поддержка и загрузка    Мой профиль    
Перейти к тексту

developerWorks Россия  >  Information Management  >

Шифрование на уровне столбцов таблиц в Informix Dynamic Server

Контроль безопасности информации в DB2 и Informix Dynamic Server

developerWorks
Опции документа

Опции документа, требующие включения JavaScript, не отображаются

Обсудить


Выскажите мнение об этой странице

Помогите нам улучшить содержание


Уровень сложности: средний

Маной Мохан, конструктор-разработчик безопасности программного обеспечения, IBM
Линетт Д. Адияламурьил, инженер по разработке IDS Security Software, IBM

20.10.2009

В статье рассматривается возможность шифрования данных на уровне столбцов таблиц (CLE), доступная в IBM Informix® Dynamic Server (IDS) версии 10 и более поздних.

Introduction

В современном мире, в основе которого лежит электронная коммерция, безопасность баз данных представляет наивысший приоритет для их пользователей. Повсеместно и постоянно современные предприятия сталкиваются с необходимостью защиты ценной информации от хакеров. С другой стороны, современные государственные и федеральные постановления, касающиеся защиты личных данных, также стимулируют компании к использованию методик шифрования для защиты баз данных. Шифрование данных на уровне столбцов таблиц (для краткости CLE) - одна из таких методик, которая позволят шифровать данные в конкретных столбцах таблиц баз данных.

CLE

С выходом IDS v10 у пользователей появилась возможность усовершенствовать конфиденциальность данных благодаря основанному на SQL решению CLE. Эта возможность предоставляет встроенный SQL-интерфейс для наиболее популярных симметричных алгоритмов шифрования. Таких, как Triple-Data Encryption Standart (TDES) и Advanced Encryption Standart (AES). Новые встроеные SQL-функции обеспечивают для храниения данных в столбцах в зашифрованном формате.

Реализация CLE в IDS не обеспечивает управления ключами. Поэтому задача по управлению ключами ложится на приложения, либо пользователей. При использовании CLE данные шифруются с использованием ключа, генерируемого по паролю через встроенные SQL-функции шифрования. Пароль может быть установлен на уровне сессии при помощи выражения SET ENCRYPTION или в качестве аргумента к функциям шифрования. Зашифрованные данные могут быть извлечены или модифицированы только при указанном в запросе пароле. IDS предоставляет пользователям простой способ запоминания паролей - при помощи подсказок. При настройке шифрования данных по паролю может быть указана подсказка. Подсказку можно увидеть используя специальную встроенную SQL-функцию. Пароли и подсказки не хранятся открытым текстом в какой-либо таблице системного каталога. Ключ, используемый в процессе - случайное значение, зависящее от текущего времени. СУБД инициализирует ключ при старте сервера. При выключении сервера ключ уничтожается.

Для шифрования IDS использует специальный виртуальный процессор encrypt VP, который занимается собственно шифрованием и дешифрованием. Параметр конфигурации VPCLASS вместе с ключевым словом может быть использован для конфигурирования encrypt VP. Если параметр VPCLASS не сконфигурирован, СУБД запускает encrypt VP автоматически при первом вызове любой функции шифрования/дешифрования, определенных для CLE. Encrypt VP также может быть добавлен динамически при помощи утилиты onmode.

Конфигурирование encrypt VP

Ниже представлен пример использования параметра конфигурации:

VPCLASS encrypt,num=5

Пример использования утилиты onmode для динамического добавления encrypt VP:

				
onmode -p 5 encrypt
	

Встроенные SQL-функции и выражения, предназначенные для CLE

Ниже представлен список функциональностей, поддерживаемых CLE:

  • ENCRYPT_TDES: Данная функция возвращает значение, которое является результатом шифрования символьной строки, или BLOB/CLOB значения. Шифрование первого аргумента функции производится алгоритмом TDES (или DES3).
    ENCRYPT_TDES(data-string-expression [, password-string [, hint ]])        
    		

  • ENCRYPT_AES: Функция ENCRYPT_AES возвращает зашифрованное значение, полученное в результате обработки первого аргумента алгоритмом AES. Первый аргумент должен быть незашифрованной строкой символов, либо smart large object (тип данных BLOB или CLOB).
    ENCRYPT_AES(data-string-expression [, password-string [, hint ]])       
    		

  • DECRYPT_CHAR: Функция DECRYPT_CHAR в качестве первого аргумента принимает зашифрованную строку символов любого символьного типа данных (CHAR, LVARCHAR, NCHAR, NVARCHAR, или VARCHAR). Пароль должен быть указан в качестве второго аргумента, если только пароль не совпадает с паролем сессии, установленным выражением SET ENCRYPTION.
    Decrypt_char(EncryptedData [, Password])    
    		

  • DECRYPT_BINARY: Функция DECRYPT_BINARY принимает в качестве первого аргумента принимает зашифрованный большой объект типа BLOB или CLOB. Пароль должен быть указан вторым аргументом если только пароль не совпадает с паролем сессии, установленным выражением SET ENCRYPTION.
    Decrypt_binary(EncryptedData [, Password])     
    		

  • GETHINT: Функция GETHINT возвращает строку символов, указанную ранее в качестве подсказки в выражении SET ENCRYPTION PASSWORD для шифрования с помощью функции ENCRYPT_AES или ENCRYPT_TDES. Эта подсказка обычно предоставляет информацию, которая может помочь пользователю указать нужный пароль для получения расшифрованных данных с помощью функции DECRYPT_CHAR или DECRYPT_BINARY.
    GETHINT(EncryptedData)       
    		

  • SET ENCRYPTION PASSWORD: Данная функция используется для определения либо сброса пароля сессии для шифрования/дешифрования символов, BLOB- или CLOB-объектов. Только IDS поддерживает данное выражение, которое является расширением стандартов ANSI/ISO для SQL. Это выражение может быть использовано в ESQL/C.
    SET ENCRYPTION PASSWORD  "password"  [ WITH HINT "hint-string" ]
    		

Use CLE in a dbaccess application

Следующий пример иллюстрирует использование алгоритма шифрования AES и функции decrypt_char , входящих в состав CLE, в среде приложения dbaccess. В данном примере данные шифруются с помощью алгоритма AES с указанием пароля mypassword1 and mypassword2, которые используются в качестве ключа шифрования. Если какой-либо другой пользователь попытается извлечь эти данные, он получит лишь зашифрованный вариант, лишенный всякого смысла. Но если операция SELECT>выполняется с использованием функции дешифрования (например decrypt_char) с указанным верным паролем, то пользователь увидит вполне осмысленные расшифрованные данные.


Листинг 1. Использование AES и decrypt_char в приложении dbaccess
                
create database test with log;
Database created.

create table tab (custname char(32), ccard char(16), enc_ccard lvarchar(3000));
Table created.

insert into tab values ("Manoj Mohan", "1234567890",
    encrypt_aes("1234567890", "mypassword1"));
1 row(s) inserted.

insert into tab values ("Lynette Daniel", "2345678901",
    encrypt_aes("2345678901", "mypassword2"));
1 row(s) inserted.

select * from tab;

custname   Manoj Mohan
ccard      1234567890
enc_ccard  0gH//AAAAEAWnTjoJu721chtLzYumGZUshGnfI2elmV

custname   Lynette Daniel
ccard      2345678901
enc_ccard  0Sbb/AAAAEAy4rjGrXe6wqETDb3d/thwySlcjVWYttH

2 row(s) retrieved.

select custname, ccard, decrypt_char(enc_ccard, "mypassword1")
    as clear_ccard from tab where custname="Manoj Mohan";

custname     Manoj Mohan
ccard        1234567890
clear_ccard  1234567890

1 row(s) retrieved.

select custname, ccard, decrypt_char(enc_ccard, "mypassword2")
    as clear_ccard from tab where custname="Lynette Daniel";

custname     Lynette Daniel
ccard        2345678901
clear_ccard  2345678901

1 row(s) retrieved.

Database closed.
      

Использование CLE в ESQL/C-приложении

CLE также может быть использован в ESQL/C-приложении. В нижеследующем примере приводится пример использования алгоритма шифрования TDES и функции дешифрования decrypt_binary.


Листинг 2. ESQL/C-приложение, использующее TDES и decrypt_binary
                
#include <stdio.h>
#include <decimal.h>
#include <datetime.h>
EXEC SQL include sqlda;
EXEC SQL include sqlca;
EXEC SQL include sqltypes;

main()
{
EXEC SQL BEGIN DECLARE SECTION;
int id;
lvarchar a[3000], b[3000];
EXEC SQL END DECLARE SECTION;

EXEC SQL drop database test;
printf("SQLCODE %d\n", SQLCODE);
EXEC SQL create database test with log;
printf("SQLCODE %d\n", SQLCODE);
EXEC SQL create table tab (id int, credit_card lvarchar(3000),
    encrypted_credit_card lvarchar(3000));
printf("SQLCODE %d\n", SQLCODE);
EXEC SQL insert into tab values (1, "1234567890",
    encrypt_tdes("1234567890", "mypassword"));
printf("SQLCODE %d\n", SQLCODE);
EXEC SQL select id, credit_card, decrypt_binary(encrypted_credit_card, "mypassword")
    into :id, :a, :b from tab;
printf("SQLCODE %d\n", SQLCODE);
printf("credit_card: %s, enc_credit_card %s\n", a, b);
}
      

Использование CLE для установки и получения подсказок

CLE также поддерживает подсказки, которые могут хранится наряду с паролями. Более того, пользователь может установить пароль для любой сесии с помощью синтаксиса SET ENCRYPTION PASSWORD . Это позволяет пользователям использовать выражение INSERT или SELECT без указания пароля для функций шифрования/дешифрования.


Листинг 3. Пример использования CLE для установки или получения подсказок
                
create database test with log;
Database created.

create table tab (custname char(32), ccard char(16), enc_ccard lvarchar(3000));
Table created.

set encryption password "VJTICOLLEGEMUMBAI" with hint "what is my PG College name?";
Encryption password set.

insert into tab values ("Manoj Mohan", "1234567890", encrypt_aes("1234567890"));
1 row(s) inserted.

select * from tab;

custname   Manoj Mohan
ccard      1234567890
enc_ccard  0fIMgAAAAEAeliIJN4liR4qPCFw9//mIyq82berEiifNLgbd3vW23CVUzI3KSCy4kYQF
91PRuayfa3WpBpbTDQ=

1 row(s) retrieved.

select custname, gethint(enc_ccard) as hint from tab where custname="Manoj Mohan";

custname  Manoj Mohan
hint      what is my PG College name?

1 row(s) retrieved.

set encryption password "SOMAIYACOLLEGEMUMBAI" with hint "what is my Eng College name?";
Encryption password set.

insert into tab values ("Lynette Daniel", "2345678901", encrypt_aes("2345678901"));
1 row(s) inserted.

select custname, gethint(enc_ccard) as hint from tab where custname="Lynette Daniel";

custname  Lynette Daniel
hint      what is my Eng College name?

1 row(s) retrieved.
      

Требования CLE к хранению данных

Зашифрованные данные, которые хранятся в символьных колонках в IDS, занимают больше места нежели незашифрованные данные. Например, если введенные данные имеют длину N байт, то соответствующий шифр AES будет занимать:


Листинг 4. Пример расчета требуемого места для CLE
                
AES	 = B64(NGM(N, 16) + H + 8) + 11
Где,
H = 0 при отсутствии подсказки; H = 40 при наличии подсказки.
NGM(x,y): Следующий множитель для y, который больше, чем x = ((x + y) / y) * y
B64(x)  : Base-64 размер шифрования = ((x + 2) / 3) * 4
      

Аналогично рассчитывается требуемое место для шифра TDES:

TDES = B64(NGM(N, 8) + H + 8) + 11
Где,
H = 0 при отсутствии подсказки; H = 40 при наличии подсказки.
NGM(x,y): Следующий множитель для y, который больше, чем x = ((x + y) / y) * y 
B64(x)  : Base-64 размер шифрования = ((x + 2) / 3) * 4
      

Требования к хранению данных для AES и TDES

Следующая таблица иллюстрирует зависимость занимаемого шифром места от различных условий и методов шифрования (AES и TDES), рассчитанных согласно вышеприведенным формулам.


Таблица 1. Место, требуемое для шифров AES и TDES
Размер данных (байт)TDES (без подсказки)AES (без подсказки)TDES (с подсказкой)AES (с подсказкой)
1..735438799
8..1543439999
16..235567107119
24..316767119119
32..397587131139
40..478787139139
100163171215227
200299299355355
500695707747759

Следует помнить, что шифрование является очень ресурсоемкой операцией и ее применение может существенно снизить производительность. Поэтому ее стоит применять только при необходимости.



В начало


Поддерживаемые типы данных

CLE поддерживает шифрование всех встроенных типов данных, кроме BYTE и TEXT. Поддерживаемые типы данных включают в себя: CHAR, VARCHAR, NCHAR, NVARCHAR, LVARCHAR, SMALLINT, INTEGER, INT8, DECIMAL, SMALLFLOAT, FLOAT, DATE, DATETIME, INTERVAL, BOOLEAN, BLOB, CLOB. Зашифрованные данные хранятся в полях типа CHAR, VARCHAR или LVARCHAR. Зашифрованные данные типов BLOB и CLOB хранятся в BLOB-полях.

Комплексные типы данных, такие как Collection и Row, также могут быть зашифрованы. Но их шифрование требует их явного преобразования. Например:

ENCRYPT_AES(LIST{1,3,2}::LVARCHAR, 'PassWord')
DECRYPT_CHAR(enc_list, 'PassWord')::LIST(INT NOT NULL)
	

Определенные пользователем DISTINCT типы шифруются также как и базовые типы данных. Определенные пользователем непрозрачные (opaque) типы данных требуют их явного преобразования в или из LVARCHAR.

Заключение

CLE предоставляет встроенные SQL интерфейс для хорошо зарекомендовавших себя симметричных алгоритмов шифрования, таких как Triple-DES и AES. В данной статье были представлен обзор того, как пользователи могут использовать CLE с целью повышения безопасности, конфиденциальности и целостности данных.



В начало


Благодарности

Авторы выражают благодарность архитектору Джонатану Леффлеру за любезно предоставленную им презентацию о CLE, которая очень помогла в подготовке данной статьи.



Ресурсы

Научиться

Получить продукты и технологии
  • Создайте свой следующий проект с помощью IBM trial software, доступного для скачивания напрямую с developerWorks.


Обсудить


Об авторах

Маной Мохан (Manoj Mohan) работал разработчиком в команде IBM-IDS пять лет. У него есть опыт проектирования и внедрения съемного модуля аутентифиации (Pluggable Authentication Module) и IP V6 поддержки в IDS сервер. Также у него есть опыт проектирования и внедрения поддержки доверительного контекста в DB2 для Linux, UNIX и Windows.


Линетт Адияламурьил вот уже более девяти лет работает с IDS в качестве инженера. Она обладает огромным опытом в областях безопасности и kernel.




Выскажите мнение об этой странице


Пожалуйста, найдите минутку и заполните форму, чтобы повысить уровень сервиса.



 


 


 


Поделиться этой статьей:

забобрить забобрить memori сохранить в memori




В начало


IBM обладает всеми авторскими правами касательно информации, расположенной на developerWorks. Использование информации приведенной на этом ресурсе без явного письменного разрешения от IBM или первоначального автора запрещены. Если Вы желаете использовать информацию с developerWorks, пожалуйста воспользуйтесь регистрационной формой для того, чтобы связаться с нами запрос на использование материалов developerWorks Россия.
    IBM в России Конфиденциальность Контакты